- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当可等待任务完成但启动异步方法的线程不可用(例如处理另一个请求)时,C# 中会发生什么?然后将使用另一个线程而不是第一个线程,或者执行将等到繁忙的线程可用?
提前感谢您的回答。
最佳答案
这取决于调度延续的线程的 SynchronizationContext
。
例如,当您在具有 UI 线程的应用程序(如 ASP.NET 或 WPF 应用程序)中使用 async/await
时,在 UI 线程上安排的任何延续也将在用户界面线程。在控制台应用程序中,不会捕获 SynchronizationContext
,默认行为是在必须恢复执行时在任何可用线程上执行。如果您考虑一下,实际上在“任何”线程上执行要比在安排延续的完全相同的线程上执行要容易得多。
所有这些只是部分正确,因为您可以通过调用 ConfigureAwait(false)
来配置 await
调用以不捕获当前 SynchronizationContext
> 在 await
ing 之前返回的 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/
我有一个 forEach循环处理数组中的数据。在该循环中间的某个地方,我必须等待 DOM 元素的更改,获取该更改,处理它,然后才能继续处理数组。 我希望在控制台中看到这个: Preparing "aa
给定以下方法: public async Task DoSomethingAsync() { // do some work await OpenSomeFileAsync();
尝试在 .exports 中运行一个异步函数,获取 Promise,然后在下一个异步函数中使用结果,但由于某种原因,无论等待如何,第二个函数都会在第一个函数之前执行。 销售.js = const sq
谁能解释为什么 c# 5 中的异步函数需要至少有 1 个等待?我找不到明确的理由/解释。 所谓必需,是指当异步函数内部没有任何 await 调用时编译器会发出警告,但不会抛出编译错误。 来自 this
我想用 Mocha 测试异步代码. 我跟着这个教程testing-promises-with-mocha .最后,它说最好的方法是 async/await。 以下是我的代码,我打算将 setTimeo
这个问题在这里已经有了答案: How do yield and await implement flow of control in .NET? (5 个答案) How is resumption
我想在 trait 中编写异步函数,但是因为 async fn in traits 还不被支持,我试图找到等效的方法接口(interface)。这是我在 Rust nightly (2019-01-0
在 node.js 中,我有一个数据库事务,我想在 then 回调中调用一个 async 方法,但我收到错误消息 关键字“等待”已保留。 这是异步 saveImage 函数: const saveIm
我正在包装 AspNet.Identity。但有些事情让我对 TPL 感到困惑。 第一个例子: public virtual async Task RemovePasswordAsync(st
我有三个 showDialog 示例。我认为 _showAlert1 是正确的,但它使用 2 个函数来实现它。 _showAlert2 也有效,但我认为它不正确,因为我认为 showDialog 是异
我正在编写一个应该尽可能快地执行所有异步函数的函数,但是,它们中只有 5 个可以同时运行。 我想使用 Promise.race 来实现,所以实现不是最好的。问题是代码执行不会在 await 处停止。我
在 Scala 和其他编程语言中,可以使用 Futures 和 Await。 (在实际代码中,会使用例如 zip+map 而不是 Await) def b1() = Future { 1 } def
这个问题在这里已经有了答案: At the end of an async method, should I return or await? (2 个回答) 8年前关闭。 我做了一些阅读,并认为我已
我知道这是一个非常开放的问题,我深表歉意。 我可以看到 Await.ready返回 Awaitable.type而 Await.result返回 T但我仍然混淆他们。 两者有什么区别? 一个是阻塞的,
为什么等待者(GetAwaiter - 使类可等待)是结构而不是类。使用类有什么坏处吗? public struct ConfiguredTaskAwaiter : ICriticalNotifyCo
这个问题在这里已经有了答案: Why doesn't Scala's Future have a .get / get(maxDuration) method, forcing us to resor
async/await 链中的所有函数都必须使用 async/await 关键字吗? async function one() { return await fetch(.....); } asy
点击组件的按钮时将执行以下方法。 async onClickButton() { await this.shoppingCartService.add(this.selectedOffer);
它似乎被记录在案的唯一地方是 this issue thread和 the actual specification .但是,删除的原因并没有在我能找到的任何地方发布。 新的推荐方式似乎是await
为什么使用 await 需要将其外部函数声明为 async? 例如,为什么这个 mongoose 语句需要它所在的函数来返回一个 promise? async function middleware(
我是一名优秀的程序员,十分优秀!