【发布时间】:2016-06-06 15:40:42
【问题描述】:
两者之间的机械有什么区别?
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();
}
我理解从逻辑上讲,两者都会产生相同的控制流。在这两种情况下,DoIOAsync 方法只会在CPUBoundWork 任务完成执行后被调用。
但是,这两种情况下CPU任务的调度会不会有区别?
更新
请确认我对上面代码的未受教育的思考是否正确。
据我了解,await 取消了线程与在线程上运行的任务之间的任何关联。虽然这对 I/O 请求非常有效,但由于您现在重用了在网络驱动程序上阻塞的 I/O 线程,您希望为 CPU 密集型工作保持线程关联性。 p>
虽然 await 破坏了这种亲和力,但 Wait() 方法,我不确定,但纯粹是猜测,只是等待任务完成。如果任务尚未开始,则在当前线程上执行。但是,如果任务已经开始较早,它会阻塞当前线程,将当前线程放在等待队列中,下一次执行调用Wait 的任务的线程回来并完成它的工作,它向等待线程发出信号,等待线程继续。因此,在调用Wait 时会保持任务的线程亲和性。
当然,所有这些都只是猜测。我想请人确认一下。
【问题讨论】:
标签: c# .net asynchronous async-await task-parallel-library