我一直在閱讀.NET 4.5中引入的異步/等待語法,並瞭解它。.Net 4.5和Task.Yield與Task.Delay作爲DoEvents的替代方案?使用哪個?
我發現簡單的示例,其中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來代替它,因爲它是最好的選擇。但首先我需要用異步/等待來溫暖。
這是在MSDN Library文章Task.Yield中明確:'出於這個原因,不靠等待Task.Yield();保持界面響應。「# –
好的。糟糕的樣本在網上,然後在misc博客。 – Wolf5