3

タスク継続のどこかでスローされた例外を処理する最良の方法は何ですか?

たとえば、以下の単純なタスクの継続 ( updateMessages-> updateInterface) がありますが、実際には、これは 2 つ以上のタスクのチェーンになる可能性があります。チェーンで発生する可能性のある障害から継続する一般的な例外「すべてをキャッチ」タスクが必要です。

私がこれを行う方法は、Action(例外を監視してログに記録する) を定義し、 TaskContinuationOptions.OnlyOnFaultedset を使用して各タスクを続行することです。おそらくこれを行うより良い方法はありますか?

Task updateMessages = Task.Factory.StartNew(() =>
{
    // Do stuff
});

Task updateInterface = updateMessages.ContinueWith(task =>
  {
    // UI updates
  }, 
  System.Threading.CancellationToken.None, 
  TaskContinuationOptions.NotOnFaulted,
  TaskScheduler.FromCurrentSynchronizationContext());

Action<Task> failureAction = new Action<Task>(failedTask =>
{
    // Observe and log exceptions
});

updateMessages.ContinueWith(failureAction, CancellationToken.None,
                            TaskContinuationOptions.OnlyOnFaulted,
                            TaskScheduler.FromCurrentSynchronizationContext());
updateInterface.ContinueWith(failureAction, CancellationToken.None,          
                             TaskContinuationOptions.OnlyOnFaulted, 
                             TaskScheduler.FromCurrentSynchronizationContext());
4

1 に答える 1

3

あなたのアプローチは私が使用するアプローチであり、うまく機能します。

質問に関するものではないいくつかの余談:

  • あなたの failureAction は本当にメイン UI スレッドで実行する必要がありますか?
  • すべてのタスクでこれを行うため、失敗の継続をアタッチするためのヘルパー メソッドを作成します。
于 2012-11-13T16:59:57.890 に答える