实体框架将(应该)处理跨await
点的线程跳转。如果没有,那是EF中的错误。OTOHOperationContextScope
基于TLS,并且await
不安全。
1.同步API维护您的ASP.NET上下文;这包括诸如用户身份和文化等在处理过程中通常很重要的东西。另外,许多ASP.NET API都假定它们在实际的ASP.NET上下文中运行(我并不是说仅使用HttpContext.Current
;我是说实际上是假定它SynchronizationContext.Current
是的一个实例AspNetSynchronizationContext
)。
2-3。我使用了直接嵌套在ASP.NET上下文中的我自己的单线程上下文,以尝试使async
MVC子操作起作用而不必重复代码。但是,不仅会失去可伸缩性的好处(至少对于请求的那部分而言),而且假设ASP.NET API在ASP.NET上下文中运行,您还会遇到它们。
因此,我从未在生产中使用这种方法。我只是在必要时使用了同步API。