这两者在机械上的区别是什么?
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 任务的调度方面是否有区别呢?
更新
请确认我的代码分析是否正确。
据我了解,await
会取消线程与正在运行该线程上的任务之间的关联。尽管这对于 I/O 请求非常有效,因为您现在可以重新使用已被网络驱动程序阻塞的 I/O 线程,但您需要维护 CPU 绑定的工作线程亲和性。
虽然 await 会破坏这种亲和性,但是 Wait()
方法,我不确定但仅仅是猜测,只是等待任务完成。如果任务还没有开始,它会在当前线程上执行它。然而,如果任务早已开始,它将阻塞当前线程,将当前线程放入等待队列中,直到下次执行调用 Wait
的任务的线程完成其工作并发出信号以唤醒等待线程。因此,调用 Wait
时会维护任务的线程亲和性。
当然,这些都只是猜测。我需要有人来确认它。
async void
是用于事件处理程序的,而LongIOBoundWorkWithSomeCPUBoundWorkAsWellAsync
看起来不像是一个事件处理程序。因此,很可能代码片段展示了错误使用async void
的情况。 - undefined