首页 > 解决方案 > 'await' 之后的代码可以在 ASP.NET 的不同线程中运行吗?

问题描述

我在这里读到https://blog.stephencleary.com/2009/10/synchronizationcontext-properties.html ASP.NET 应用程序的执行上下文没有特定的关联线程。这是否意味着等待之后的代码将(可以)在具有相同上下文的不同线程中执行?在这种情况下,同步执行怎么可能导致死锁?还是 ASP.NET 应用程序不属于这种死锁的情况?

提前致谢。

标签: c#asp.netasp.net-coreasync-awaitconfigureawait

解决方案


对于ASP.NET Classic (.NET Framework),有一个特殊AspNetSynchronizationContext的,延续会回发到原来的上下文线程。

ASP.NET Core没有。如果您检查SynchronizationContext.Current,您会发现它设置为null. 因此,延续可以自由使用它选择的任何线程,并且在这方面不会遭受典型的死锁


更新

@StephenCleary在评论中的一些重要更正

次要更正:在经典 ASP.NET上,SynchronizationContext 代表请求上下文,而不是特定线程

方法可以在. _ await发生死锁是因为该请求上下文中有一个,以确保一次只有一个线程可能在 请求上下文中

因此,当异步方法准备好恢复时,会采用一个线程池线程,该线程 进入请求上下文并尝试获取该 。如果上下文中有另一个线程阻塞在该任务上,则该锁已被占用并且将发生死锁


推荐阅读