【发布时间】:2012-10-18 21:43:09
【问题描述】:
我一直在阅读 .Net 4.5 中引入的 async/await 语法并有所了解。
我找到了简单的示例,其中 Task.Yield 是要走的路,而不是 Application.DoEvents。我尝试了其中一个样本(填空)
Form1 上带有 1 个按钮的代码:
public async void button1_Click(object sender, EventArgs e) {
var list = new List<int>();
for (int i = 0; i < 10000; i++) {
list.Add(i);
}
for (int i = 0; i < list.Count; i++) {
Process(list[i]);
await Task.Yield();
//await Task.Delay(1);
}
}
public static void Process(int i) {
Debug.WriteLine(i);
}
但是,运行此代码时,UI 线程被阻塞,或者我认为它被阻塞,因为在代码运行时我无法移动窗口。如果我注释掉 Task.Yield() 并改用 Task.Delay(1) 行,则 GUI 会响应。
所以我在这里误解了什么?我知道使用 DoEvents 等是不好的做法,但是我负责使用它的一些遗留代码,我的目标是用 Yield 替换它,因为它是最佳选择。但首先我需要用 async/await 暖和起来。
【问题讨论】:
-
Task.Yield 的 MSDN 库文章中有明确说明:
For this reason, do not rely on await Task.Yield(); to keep a UI responsive. -
好的。不良样本在网上发布,然后在其他博客上。
-
这太奇怪了。据我所知,产量应该首先在 ui 事件循环中执行所有内容,然后在当前上下文中恢复。大开眼界。
标签: delay .net-4.5 yield doevents async-await