WPFでの非同期処理について勉強しております。
いろいろ調べてみた結果非同期自体の処理はできましたが、なぜ動いているのか理解できませんでした。
理解している点として
・ボタンクリック時の関数にasync
をつけることで非同期での処理ができる
・この関数自体はUIスレッドで動いており、新しくタスクを生成すると別スレッドで動く
は理解しました。
ですがこの関数はUIスレッドで動いているため
タスクが終了するまでUIスレッドが止まる気がします。
私の中ではUIが固まり操作できなくなると思っているのですが
とくに固まることなく動いているのが疑問です。
理解が間違っているのでしょうか?
試したこと
実際同じスレッドか確かめるため非同期用の関数と普通のクリック関数でスレッドIDを出力
→同じIDだった
同時にUIの操作ができるか確かめるためそれぞれの関数からTextBoxを操作
→非同期の関数がUIを更新していても、別関数から操作可能
ソースコード
xaml
1<TextBox x:Name="text" HorizontalAlignment="Left" Height="224" Margin="10,35,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="272"/> 2<Button Content="Button1" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click1"/> 3<Button Content="Button2" HorizontalAlignment="Left" Margin="92,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click2"/>
C#
1private async void Button_Click1(object sender, RoutedEventArgs e) 2{ 3 while (true) { 4 await Task.Delay(1); 5 text.AppendText("buttonClick1\n"); 6 Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: ButtonClick1"); 7 } 8} 9 10private void Button_Click2(object sender, RoutedEventArgs e) 11{ 12 text.AppendText("buttonClick2\n"); 13 Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: ButtonClick2"); 14}
また上記のソースコードでButton_Click1
関数内で
awaitの行をコメントアウトすると完全にUIが固まってしまう理由も知りたいです。
補足情報(FW/ツールのバージョンなど)
Visual Studio Community 2017を使用
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/05 01:12