我一直在研究在.Net 4.5中引入的async/await语法,并逐渐了解它的用法。
我发现在一些简单的示例中,使用Task.Yield比使用Application.DoEvents更为合适。我尝试了其中一个示例(填充空白)。
Form1上的代码有一个按钮:
然而,运行此代码时,UI线程被阻塞或者我认为它被阻塞了,因为当代码运行时我无法移动窗口。如果我注释掉Task.Yield()并使用Task.Delay(1)行,则GUI是响应的。
所以我是否在这里误解了什么?我知道使用DoEvents之类的做法是不好的,但我有一些遗留代码需要负责,它使用了这种方式,我打算将其替换为Yield,因为这是最好的选择。但首先我需要熟悉async/await。
我发现在一些简单的示例中,使用Task.Yield比使用Application.DoEvents更为合适。我尝试了其中一个示例(填充空白)。
Form1上的代码有一个按钮:
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。
因此,请勿依赖于 await Task.Yield(); 来保持UI响应。
- Hans Passant