ある程度、特にタスクコードと呼び出し元コードを「所有」している場合は、好みの問題です。考慮すべき点がいくつかあります。
まず、処理方法を知っている例外のみをキャッチする必要があります。これは、継続で処理する場合でも、アクション内でtry/catchを使用して処理する場合でも適用されます。
キャッチされない例外に関する.NET4.5の動作の変更にも注意してください。この変更は、「純粋な」アプローチ(キャッチされていないタスクの例外でプロセスを破棄する)から、それほど厳しくないアプローチに効果的になります。それでも、意図的に新しい動作に依存するのは良くありません。
2つの選択肢のどちらを優先するかについては、2番目の選択肢を選択するための議論があります。継続で例外を処理することです。 .NETでは、メソッドが。を返すことがますます一般的になりますTask
。たとえば、Stream.ReadAsync。このようなメソッドを正しく使用するには、継続が必要です(従来の方法、または新しいawait
機能でtry / catchブロックを使用します。これは同じことですが、コーディングと読み取りがはるかに簡単です)。したがって、明示的に別のことを知らない限り、いずれかが失敗する可能性があると想定し、適切な例外処理動作をコーディングする習慣を身に付けることをお勧めします。Task
興味がある場合は、.NET4.5で2番目の例をコーディングする別の方法を次に示します。
async Task MyMethod()
{
try
{
await Task.Run(
() =>
{
// Some work.
});
}
catch (SomeException ex)
{
}
}
もう1つの違いは、コードがUIスレッドから呼び出されるWindowsフォームまたはWPFアプリケーションに最も頻繁に当てはまります。ここで、を使用する場合のTPLのデフォルトの動作はawait
、UIスレッドにマーシャルする同期コンテキストを使用して継続を実行することです。つまりTask.Run
、UIスレッドから呼び出された場合、継続はUIスレッドでも実行されます。
これは、例外に応答してユーザーにダイアログを表示する場合に役立ちます。Task
worload内からそれを正常に行うことはできません。ではなく明示的な継続を使用する場合は、 TaskScheduler.FromCurrentSynchronizationContextを使用して作成されたものをContinueWithの適切なオーバーロードにawait
渡す必要があります。TaskScheduler