gpt4 book ai didi

C#。如果 "after await"线程忙,会发生什么?

转载 作者:行者123 更新时间:2023-12-03 22:53:36 25 4
gpt4 key购买 nike

当可等待任务完成但启动异步方法的线程不可用(例如处理另一个请求)时,C# 中会发生什么?然后将使用另一个线程而不是第一个线程,或者执行将等到繁忙的线程可用?

提前感谢您的回答。

最佳答案

这取决于调度延续的线程的 SynchronizationContext

例如,当您在具有 UI 线程的应用程序(如 ASP.NET 或 WPF 应用程序)中使用 async/await 时,在 UI 线程上安排的任何延续也将在用户界面线程。在控制台应用程序中,不会捕获 SynchronizationContext,默认行为是在必须恢复执行时在任何可用线程上执行。如果您考虑一下,实际上在“任何”线程上执行要比在安排延续的完全相同的线程上执行要容易得多。

所有这些只是部分正确,因为您可以通过调用 ConfigureAwait(false) 来配置 await 调用以不捕获当前 SynchronizationContext > 在 awaiting 之前返回的 Task

为了说明这一点,请注意,如果在 ASP.NET 应用程序中您在 UI 线程上启动异步工作,然后强制它阻塞直到该工作完成(例如通过调用 Task.Result),您的代码可能会死锁 在返回的 Task 上。现在您有一个必须在 UI 线程上执行的延续,但 UI 线程正在等待该延续执行,因此不会继续执行。如果您在控制台应用程序中执行相同操作并且线程池中有空闲线程,则代码不会阻塞,因为它可以在“任何”线程上自由执行。调用 ConfigureAwait(false) 后,任何应用程序都会发生同样的情况 - 因为不会捕获任何 SynchronizationContext

TL;DR:您实际上问了一个相当简单的问题,但答案却非常复杂。简而言之:允许在任何线程上继续执行,除非 SynchronizationContext 强制它不这样做。更详细地说,这个答案会变成一篇相当大的博文,比我聪明得多的人已经写过关于这个的博文,所以我只会将你链接到有关该主题的更多资源:

Stephen Toub's FAQ about ConfigureAwait

Stephen Cleary's detailed MSDN article

Stephen Toub's "Await, SynchronizationContext, and Console Apps"

Stephen Cleary about ASP.NET Core SynchronizationContext

Stephen Cleary's "Don't Block on Async Code"

What does SynchronizationContext do?

Why the default SynchronizationContext is not captured in a Console App?

关于C#。如果 "after await"线程忙,会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59595842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com