await 後の処理を元スレッドに戻さず、非同期スレッドでそのまま継続したい場合はConfigureAwaitメソッドを使う。
private async void Button_Click(object sender, RoutedEventArgs e) { this.button.IsEnabled = false; await Task.Run(() => Thread.Sleep(3000)).ConfigureAwait(false); this.button.IsEnabled = true; //--- UIスレッド上でないので例外が発生する }上に示すサンプルのようにConfigureAwaitメソッドを利用します。第1引数にはUIスレッドに同期させるかどうかのbool値を指定します。なので、上記のサンプルではUIスレッドに同期しないように指示していることになります。そしてこの場合、ボタンの有効化の処理はUIスレッド上で動作しないため例外が発生します。
非同期メソッド入門 (4) – UIスレッドとの同期 – xin9le.net
引数には
- 元スレッドで継続する場合 → true
- 非同期スレッドで継続する場合 → false
を指定する。