首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UI线程中的C#等待

UI线程中的C#等待
EN

Stack Overflow用户
提问于 2020-08-14 23:45:05
回答 1查看 711关注 0票数 5

按Microsoft Visual C#逐步第9版编写

等待操作符指示方法应该由单独的任务运行,并且调用代码被挂起,直到方法调用完成。调用代码使用的线程被释放并重用。如果线程是用户界面线程,这一点很重要,因为它使用户界面能够保持响应。

假设我有一个IO绑定并释放CPU的方法:

代码语言:javascript
复制
private async Task DoLongRunningIO()
{
    ...
}

上面这段是否意味着

代码语言:javascript
复制
await DoLongRunningIO();
message.Text = "Done";

在UI线程中,仍然会保持UI响应,因为UI线程被释放了?(与阻止UI线程的DoLongRunningIO().Wait()相反)

如果答案是肯定的,我想如果长时间运行的任务是CPU密集型的,那就不是真的了,因为在这种情况下UI线程仍然被消耗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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所做的唯一事情就是指出当前方法中的一个点,在该点中,如果对象未处于已完成的状态,该方法应该返回给调用方。它取决于任何表达式生成可访问对象来处理如何创建该任务,以及它是在单独的线程中完成,还是以异步的方式完成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63421267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档