gpt4 book ai didi

C# 在 UI 线程中等待

转载 作者:行者123 更新时间:2023-12-03 19:06:42 25 4
gpt4 key购买 nike

根据 Microsoft Visual C# Step by Step 9th 版:

The await operator indicates that a method should be run by separate task,and the calling code is suspended until the method call completes.The thread used by the calling code is released and reused.This is important if thread is the user interface thread, as it enables the user interface to remain responsive.


假设我有一个受 IO 限制并释放 CPU 的方法:
private async Task DoLongRunningIO()
{
...
}
上一段是否意味着运行
await DoLongRunningIO();
message.Text = "Done";
UI 线程中的 UI 线程是否仍然会保持 UI 响应,因为 UI 线程被释放? (与 DoLongRunningIO().Wait() 相反,后者会阻塞 UI 线程)
如果答案是肯定的,我认为如果长时间运行的任务是 CPU 密集型的,那么我认为这不是真的,因为在这种情况下 UI 线程仍然被消耗?

最佳答案

Does the above paragraph mean that running

await DoLongRunningIO();
message.Text = "Done";

in the UI thread will still keep the UI responsive since the UI thread is released?


是的。

If the answer is yes, I assume it wouldn't be true if the long running task was CPU intensive instead, since the UI thread is still consumed in that case?


不,你的假设是错误的。 “线程”和“CPU”不是一回事。即使你的机器只有一个 CPU,也可以有一个 CPU 密集型线程在运行,UI 线程在运行,OS 会在它们之间共享 CPU。您可能会发现响应能力略有下降,但 UI 线程仍然能够运行。
如果你有一个以上的 CPU 内核,就像几乎所有现代硬件的情况一样,那么只要这两个线程不交互,UI 线程就可以畅通无阻地运行,即使还有一个 CPU——密集线程运行。
请注意,这一切都假设 DoLongRunningIO()方法编写正确,即实际上反射(reflect)了异步处理的操作。对于 CPU 密集型任务,这通常包括调用 Task.Run()来执行操作,当然也可以使用其他机制。
如果该方法编写不正确,则所有赌注都将取消。您没有提供有关该方法的任何详细信息,因此无法确定您的方案是否是这种情况。

旁白:
对于它的值(value),我对您从书中引用的措辞“等待运算符指示方法应由单独的任务运行”表示异议。 await运算符(operator)没有说明应该如何运行/调用/执行/等方法或操作。唯一的事情 await do 表示当前方法中的一个点,给定一个可等待对象(通常是 Task),如果该对象未处于完成状态,则该方法应返回给调用者。这取决于生成可等待对象的任何表达式来处理该任务的创建方式以及它是在单独的线程中完成还是以其他方式以异步方式完成。

关于C# 在 UI 线程中等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63421267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com