|
ぶなっぷさん、Hongliangさん、
返信いただきありがとうございます。
> 問題になるのは、awaitの行に到達すると、いったんreturnするということです。 これが目からウロコでした。始めの投稿の※1にあるように、 私はブロックされたような状態になるものと思っていましたが、 いったんreturnするのですね。 よって呼び出し元の関数は処理を継続する。と。なるほど・・・。
> 1) DoWorkAsync()メソッド内で完結 > private void button1_Click(object sender, EventArgs e) > { > label1.Text = "実行中・・・"; > var task = DoWorkAsync(); > label1.Text = "完了"; // B > } > > private async Task DoWorkAsync() > { > for (int i = 0; i < 10; i++) > { > await Task.Delay(1000); // @ > label1.Text = i.ToString(); // A > } > } これでもできるのですね。taskで戻りを取っており、task.Resultで戻り値を参照するとブロックされました。(<int>に変えて。) 1)よりも2)を使う場合の方が一般的と思いましたがいかがでしょうか。 awaitで一目瞭然だし、result参照するとブロックされるし。
> 2) イベントハンドラで待機 > private async void button1_Click(object sender, EventArgs e) > { > label1.Text = "実行中・・・"; > await DoWorkAsync(); > label1.Text = "完了"; // B > } > > private async Task DoWorkAsync() > { > for (int i = 0; i < 10; i++) > { > await Task.Delay(1000); // @ > label1.Text = i.ToString(); // A > } > } こちらの実装で、さらに質問させてください。 興味で、これらの関数がどのスレッドで動作しているか確認したところ、 DoWorkAsync()もbutton1_Click()もUIスレッドでした。 button1_Click()からawaitでDoWorkAsync()が実行され、 非同期で別スレッドで実行されていると思ったのですが、 同じスレッドで動作しているようです。 DoWorkAsync()内の「await Task.Delay(1000);」は別スレッドで動作している認識ですが、 なぜ同じスレッドで動作しているのでしょうか。
|