我在这里读到 https://blog.stephencleary.com/2009/10/synchronizationcontext-properties.html ASP.NET 应用程序的执行上下文没有特定的关联线程。这是否意味着 await 之后的代码将(可以(在具有相同上下文的不同线程中执行?在这种情况下,同步执行怎么可能导致死锁?或者 ASP.NET 应用程序不是这种死锁的情况?
提前谢谢。
对于ASP.NET 经典(.NET Framework(,有一个特殊的AspNetSynchronizationContext
,延续将回发到原始上下文线程。
ASP.NET 核心没有。如果您检查SynchronizationContext.Current
您会发现它设置为null
.因此,延续可以自由使用它选择的任何线程,并且在这方面不会遭受经典的死锁
更新
评论中@StephenCleary的一些重大更正
小修正:在经典 ASP.NET上,
SynchronizationContext
表示请求上下文,而不是特定线程。该方法可以在
await
后的任何线程池线程上恢复。 发生死锁是因为存在作为该请求一部分的锁上下文,以确保一次只能有一个线程位于请求上下文。因此,当异步方法准备好恢复时,会占用一个线程池线程,该线程进入请求上下文并尝试获取该线程锁。如果上下文中该任务上存在另一个线程被阻止,则锁已被占用,并且将发生死锁