2019/07/18(Thu) 11:02:37 編集(投稿者)
■No91660 (魔界の仮面弁士 さん) に返信
> 以下、自分の認識です。
> おかしな所があったら突っ込み歓迎。
魔界の仮面弁士さんはいつも完璧なので
突っ込みなどないのですが、
同じことの箇条書き説明してみました。
01 class AsyncTest {
02 private bool busy = false;
03 public bool IsBusy() {
04 return busy;
05 }
06 public async void AsyncMethod() {
07 busy = true;
08 await Task.Run(() => {
09 HeavyWeightMethod();
10 });
11 busy = false; //(2)ここへ来なくなる
12 }
13 public void HeavyWeightMethod() {
14 Thread.Sleep(1000);
15 }
16 }
17 private void Button_Click(object sender, RoutedEventArgs e) {
18 var asyncTest = new AsyncTest();
19 asyncTest.AsyncMethod();
20 while(asyncTest.IsBusy()) { //(1)これを書くと...
21 Thread.Sleep(100);
22 }
23 MessageBox.Show("Done");
24 }
UIスレッド
18,19,07,08,20,04,21,22(ループ)
スレッドA(08から)
09,14
08のawaitの機能でスレッドAの処理が終了したら、
08はUIスレッドで実行されたので
11もUIスレッドで実行しようとするが、
UIスレッドは20から22のループ中であるため、
UIスレッドに切り替えができない(デットロック)。