- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
两者之间的机械区别是什么?
async void LongIOBoundWorkWithSomeCPUBoundWorkAsWellAsync()
{
await Task.Run(CPUBoundWork);
// Do IO bound work
await DoIOAsync();
}
and
async void LongIOBoundWorkWithSomeCPUBoundWorkAsWellAsync()
{
var cpuTask = Task.Run(CPUBoundWork);
cpuTask.Wait();
// Do IO bound work
await DoIOAsync();
}
我理解,从逻辑上讲,两者都会导致相同的控制流。在这两种情况下,只有在 CPUBoundWork
任务完成执行后,才会调用 DoIOAsync
方法。
但是,在这两种情况下,CPU 任务的调度会有所不同吗?
更新
请确认我对上述代码的未受过教育的反射(reflection)是否正确。
据我了解,await
取消了线程与线程上正在运行的任务之间的任何关联。虽然这对 I/O 请求非常有用,但由于您现在重新使用在网络驱动程序上阻塞的 I/O 线程,您希望为 CPU 绑定(bind)工作保持线程亲和性。 p>
虽然 await 破坏了这种亲和性,但我不确定但纯粹是猜测,Wait()
方法只是等待任务完成。如果任务尚未开始,则在当前线程上执行。但是,如果任务已经开始得更早,它会阻塞当前线程,将当前线程放入等待队列,下次执行调用 Wait
的任务的线程会出现并完成它的工作,它向等待线程发出信号,等待线程继续。因此,在调用 Wait
时会维持任务的线程亲和性。
当然,这一切都只是猜测。我希望有人确认。
最佳答案
It is my understanding that await disassociates any affinity between the thread and the task that was being run on the thread.
不,这根本不是发生的事情。
首先,await
不会导致任何运行,也不会被"dispatch"。在您到达 await
之前,调度(如果有)和运行(如果有)已经在进行中。
await
是一个“异步等待”;也就是说,它异步等待任务完成。 “异步”在这里的意思是“不阻塞当前线程”。
我有更详细的introduction to async
and await
在我的博客上。
I understand that logically, both would result in the same flow-of-control.
不是真的。 Wait
会阻塞当前线程,而 await
不会。
Under both the cases, the DoIOAsync method would get called only after the CPUBoundWork task has completed execution.
这是正确的。
However, would there be a difference in terms of the scheduling of the CPU task in both the cases?
不,在这两种情况下,调度都是由 Task.Run
完成的,而不是 Wait
或 await
。
While this works great for I/O requests, since you now re-use an I/O thread that was blocked on a network driver, you want to maintain thread-affinity for CPU bound work.
如果你想留在同一个线程上,那么你不能使用Task.Run
。您必须直接调用 CPUBoundWork
。
the Wait() method, I am not sure but purely guessing, simply waits for the task to complete. If the task has not yet begun, it executes it on the current thread.
它的意义远不止于此。有时会,有时不会。在您发布的代码中,它通常不会(因为 CPUBoundWork
已经启动)。
Therefore, thread-affinity for the task is maintained when calling Wait.
同样,这是一种简化。如果通过“线程亲和性”你的意思是线程在 Wait
之前和之后是相同的,那么是的,这是正确的。
然而,blocking on tasks within an asynchronous method can be dangerous ;正如我在我的博客中描述的那样,您可能会陷入僵局。如果您正在考虑将 Task.Run
与 async
结合使用,请查看我的 Task.Run
etiquette guide .
关于c# - 在 CPU 绑定(bind)任务上使用 await 关键字与 Task.Wait() 方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37603609/
我有一个 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(
我是一名优秀的程序员,十分优秀!