私は、.Net 4.5 で導入された async/await 構文を読んで、その感触を得てきました。
Application.DoEvents ではなく Task.Yield を使用する簡単なサンプルを見つけました。サンプルの 1 つを試してみました (空白を埋める)
ボタンが 1 つある 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 で暖かくなる必要があります。