3

タスクの配列があり、taskArray使用してタスクの継続を作成しContinueWhenAll、1 つ以上のタスクがtaskArray例外をスローするとします。私の質問は、これがにつながる可能性のあるシナリオはありますUnobservedTaskExceptionか?

つまり、基本的に質問は、単一のタスクに対して行うようContinueWhenAllに例外を観察しますか? いいえの場合、各タスクの例外を明示的に見たくない場合は、タスクのグループに何を使用する必要がありますか。一般的なタスクには使用できないため、使用したくありません。taskArrayWaitWaitAll

4

2 に答える 2

2

アプリケーション全体のタスクから例外をキャッチすることが許容される場合は、davenewza の回答で十分です。

そうでない場合は、やりたくないことをしなければなりません(何らかの方法で例外を観察してください)。次の 2 つのオプションがあります。

  1. タスクのプロパティをOnlyOnFaulted調べて例外を観察することが唯一の仕事であるケースで実行される各タスクの継続を作成します。Exception
  2. ContinueWhenAll の継続では、タスクを例外のあるものとないものに分割できます。

        Task.Factory.ContinueWhenAll(tasks, ts =>
        {
            var lookup = ts.ToLookup(t => t.Exception != null);
            var faultedTasks = lookup[true];
            var nonFaultedTasks = lookup[false];
        });
    
于 2012-11-30T14:35:29.230 に答える
1

いいえ、ContinueWhenAllタスク内からスローされた例外は観察されません。

TaskScheduler.UnobservedTaskExceptionイベントを使用して、任意のタスクで発生した可能性のある例外を「キャッチ」して観察できます。UnobservedTaskExceptionこれは、ファイナライザ スレッドによって がスローされる直前に発生します。ここで例外を確認できます。

TaskScheduler.UnobservedTaskException += (sender, e) =>
{
    e.SetObserved();
};
于 2012-11-30T07:20:13.650 に答える