await 後の処理を非同期スレッドで継続する

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

を指定する。