Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以在';等待&x27;在ASP.NET的不同线程中运行?_C#_Asp.net_Asp.net Core_Async Await_Configureawait - Fatal编程技术网

C# 可以在';等待&x27;在ASP.NET的不同线程中运行?

C# 可以在';等待&x27;在ASP.NET的不同线程中运行?,c#,asp.net,asp.net-core,async-await,configureawait,C#,Asp.net,Asp.net Core,Async Await,Configureawait,我在这里读到ASP.NET应用程序的执行上下文没有特定的关联线程。这是否意味着等待后的代码将(可以)在具有相同上下文的不同线程中执行?在这种情况下,同步执行如何可能导致死锁?或者ASP.NET应用程序不存在这种死锁 提前感谢。对于ASP.NET Classic(.NET Framework),有一个特殊的AspNetSynchronizationContext,继续将发回原始上下文线程 ASP.NET核心没有一个。如果检查SynchronizationContext.Current,您会发现它被

我在这里读到ASP.NET应用程序的执行上下文没有特定的关联线程。这是否意味着等待后的代码将(可以)在具有相同上下文的不同线程中执行?在这种情况下,同步执行如何可能导致死锁?或者ASP.NET应用程序不存在这种死锁

提前感谢。

对于ASP.NET Classic(.NET Framework),有一个特殊的
AspNetSynchronizationContext
,继续将发回原始上下文线程

ASP.NET核心没有一个。如果检查SynchronizationContext.Current,您会发现它被设置为
null
。因此,一个延续可以自由地使用它选择的任何线程,并且在这方面不会遇到经典的死锁


更新

评论中的一些重大更正

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

等待
之后,该方法可以在任何线程池线程上恢复。 发生死锁是因为该请求中有一个锁 上下文,以确保一次只能有一个线程位于 请求上下文

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


ASP.NET为每个HTTP请求提供一个不同的线程,并且特定的线程实际上可能会因HTTP请求而更改。也就是说,一个特定的HTTP请求一次只能由一个线程处理,这就是为什么您不必对大多数变量进行
锁定的原因。例外情况是,如果您特意让它以其他方式工作,例如使用
Task.Run
。我认为这篇文章的意思是ASP.Net classic有一个同步上下文,也就是说,当continuation尝试在阻塞调用上运行时,会发生死锁,但没有像Winforms那样的特定关联线程,其中有一个main/GUI线程连接到该线程synchronization@JohnWu,这是否意味着如果某个线程已经在http请求中执行,并且由于死锁而被阻塞,那么没有其他线程可以继续执行?不完全是。。。其他线程可以运行与原始请求无关的其他代码(可能处理其他请求),死锁(在绑定到原始请求的同步上下文的阻塞线程和尝试在该上下文上继续的异步操作之间)只会影响一个线程,等待continuation运行的异步操作本身不会消耗额外的线程。您可以说对于.NET Framework情况,continuation将发回原始上下文,但是,正如我所知道的上下文!=原始线程。John Wu在上面提到了线程敏捷性。是不是.NET Framework的情况?线程池是否可以创建新线程并为其分配AspNetSynchronizationContext,并在原始线程繁忙时继续执行?@denysalexiev如果您所在的框架中有SynchronizationContext,请不要阻塞
async
就这么简单,实际上,您可能会遇到死锁的风险。你想解决什么问题?我不太明白你最后的答案。你能添加更多细节吗?@Denysalexiev问答格式并不适合深度提问和回答线索,如果你先看一下,如果你有更多问题,你可以再次发布。小更正:在经典ASP.NET上,
SynchronizationContext
表示请求上下文,而不是特定线程。在
等待
之后,该方法可以在任何线程池线程上恢复。发生死锁是因为请求上下文中有一个锁,以确保一次只能有一个线程在请求上下文中。因此,当
async
方法准备好恢复时,将获取一个线程池线程,该线程进入请求上下文并尝试获取该锁。如果上下文中有另一个线程在该任务上被阻塞,则该锁已被占用,将发生死锁。