我在这里阅读了https://blog.stephencleary.com/2009/10/synchronizationcontext-properties.html,ASP.NET应用程序的执行上下文没有特定的关联线程。这是否意味着await之后的代码将可以在具有相同上下文的不同线程中执行?在这种情况下,同步执行可能导致死锁吗?还是ASP.NET应用程序不是这样的死锁情况?
提前致谢。
对于ASP.NET Classic(.NET Framework),有一个特殊的AspNetSynchronizationContext
,延续将回发到原始上下文线程。
ASP.NET Core没有一个。如果您进行检查SynchronizationContext.Current
,则会发现它已设置为null
。因此,延续可以自由使用其选择的线程,并且在这方面不会遭受经典的死锁
更新资料
@StephenCleary在评论中进行了一些重大更正
较小的更正:在经典的ASP.NET上,
SynchronizationContext
表示请求上下文,而不是特定线程。该方法可以在之后的任何线程池线程上恢复
await
。之所以发生死锁,是因为该请求上下文中有一个锁,以确保一次仅一个线程位于请求上下文中。因此,当异步方法准备好恢复时,将采用线程池线程,该线程进入请求上下文并尝试获取该锁。如果上下文中该任务上有另一个线程被阻止,则该锁已被使用,并且将发生死锁
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句