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

ナビゲーションに移動 検索に移動
294行目: 294行目:
                 .Select(f => new { File = f.File, Hash = SHA256.Create().ComputeHash(f.Data)})  // 処理B(ハッシュ値計算)
                 .Select(f => new { File = f.File, Hash = SHA256.Create().ComputeHash(f.Data)})  // 処理B(ハッシュ値計算)
                 .ToArray();
                 .ToArray();
</syntaxhighlight>
<br><br>
== 例外処理 ==
<code>Task</code>クラスや<code>Parallel</code>クラスで発生する例外は、例外<code>AggregateException</code>としてキャッチすることができる。<br>
<syntaxhighlight lang="c#">
try
{
    Parallel.Invoke(
                    () => throw new ArgumentException(),
                    () => throw new InvalidOperationException(),
                    () => throw new FormatException()
                  );
}
catch (AggregateException exception)
{
    // 原因となるExceptionを確認する場合、FlattenメソッドのInnerExceptionsプロパティを使用する
    var exceptions = exception.Flatten().InnerExceptions;
    foreach (var ex in exceptions)
    {
      Debug.WriteLine(ex.GetType());
    }
}
</syntaxhighlight>
<br>
ただし、<code>Task</code>クラスを<code>await</code>する場合、個別の<code>Exception</code>クラスを使用してキャッチすることもできる。<br>
<syntaxhighlight lang="c#">
try
{
    var addresses = await Dns.GetHostAddressesAsync("example.jp");
}
catch(SocketException exception)
{
    Debug.WriteLine(exception.ToString());
}
</syntaxhighlight>
<br>
<code>Task</code>クラスで発生したキャッチされていない例外をまとめて処理する場合、<code>TaskScheduler.UnobservedTaskException</code>メソッドを使用する。<br>
<syntaxhighlight lang="c#">
TaskScheduler.UnobservedTaskException += (sender, e) =>
{
    AggregateException ae = e.Exception;
    Debug.WriteLine(ae.ToString());
    e.SetObserved();  // .NET Framework 4.0の場合、これを記述しないとソフトウェアが強制終了する
};
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>

案内メニュー