「C Sharpの基礎 - マルチスレッド」の版間の差分

ナビゲーションに移動 検索に移動
366行目: 366行目:
       e.SetObserved();  // .NET Framework 4.0の場合、これを記述しないとソフトウェアが強制終了する
       e.SetObserved();  // .NET Framework 4.0の場合、これを記述しないとソフトウェアが強制終了する
     };
     };
}
</syntaxhighlight>
<br>
上記の例外処理において、以下のようなメソッドを記述すると便利である。<br>
<code>ValueTask</code>構造体ではなく<code>Task</code>クラスでもよいが、<code>ValueTask</code>構造体にすることにより、アロケーションコストを削減できる可能性がある。<br>
<syntaxhighlight lang="c#">
public void Button_Click(object sender, EventArgs e)
{
    SafeAsyncBlock(async () =>
                  {
                      // 非同期で取得
                      var body = await httpClient.GetStringAsync("https://example.com/foobar");
                      var foobar = JsonConvert.DeserializeObject<FooBar>(body);
                      // 表示
                      textBox.Text = $"${foobar.Price}";
                  });
}
// 非同期処理で発生する例外を安全に処理する
public static async void SafeAsyncBlock(Func<ValueTask> action)
{
    try
    {  // 非同期処理を実行
      await action();
    }
    catch (Exception ex)
    {  // 未処理の例外を補足する
        Trace.WriteLine($"Log: {ex}");
    }
    catch
    {  // SEHも補足
      Trace.WriteLine("Log: Caught uninterpreted exception.");
    }
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>

案内メニュー