按Microsoft Visual C#逐步第9版编写
等待操作符指示方法应该由单独的任务运行,并且调用代码被挂起,直到方法调用完成。调用代码使用的线程被释放并重用。如果线程是用户界面线程,这一点很重要,因为它使用户界面能够保持响应。
假设我有一个IO绑定并释放CPU的方法:
private async Task DoLongRunningIO()
{
...
}上面这段是否意味着
await DoLongRunningIO();
message.Text = "Done";在UI线程中,仍然会保持UI响应,因为UI线程被释放了?(与阻止UI线程的DoLongRunningIO().Wait()相反)
如果答案是肯定的,我想如果长时间运行的任务是CPU密集型的,那就不是真的了,因为在这种情况下UI线程仍然被消耗?
发布于 2020-08-14 23:55:10
上面的段落是否意味着运行
等待DoLongRunningIO();message.Text =“已完成”;
在UI线程中,仍然会保持UI响应,因为UI线程被释放了?
是。
--如果答案是肯定的,我想如果长时间运行的任务是CPU密集型的,那就不是真的了,因为在这种情况下,UI线程仍然被占用?
不,你的假设是错误的。“线程”和"CPU“不是一回事。即使您的机器只有一个CPU,也可以有一个CPU密集型线程运行,UI线程正在运行,操作系统将在它们之间共享CPU。您可能会发现响应能力略有下降,但是UI线程仍然能够运行。
如果您有多个CPU核心,几乎所有现代硬件都是这样,那么只要这两个线程不交互,UI线程就能够不受阻碍地运行,即使也有一个CPU密集型线程在运行。
请注意,这一切都假定DoLongRunningIO()方法是正确编写的,也就是说,实际上是否反映了异步处理的操作。对于CPU密集型的任务,这通常包括调用Task.Run()来执行操作,当然还有其他的机制可以代替。
如果该方法写得不正确,那么所有的赌注都取消了。您没有提供有关该方法的任何细节,因此不可能说在您的场景中是否存在这种情况。
撇开:
至于它的价值,我对“等待操作符指示一个方法应该由单独的任务运行”这句话表示异议,这是您从书中引用的。await运算符没有说明方法或操作应该如何运行/调用/执行/等。await所做的唯一事情就是指出当前方法中的一个点,在该点中,如果对象未处于已完成的状态,该方法应该返回给调用方。它取决于任何表达式生成可访问对象来处理如何创建该任务,以及它是在单独的线程中完成,还是以异步的方式完成。
https://stackoverflow.com/questions/63421267
复制相似问题