8

並行して実行する必要がある 3 つのタスクがあります。3 つすべてを待ってから、結果の処理を続行する必要があります。次のようなものです:

var results = await Task.WhenAll(task1, task2, task3);
return process(results);

これは、3 つのタスクすべてが正常に完了すると正常に機能します。ただし、それらのいずれかが失敗すると、例外が発生し、最後までバブルアップします。これは私が望むものではありません。これらのタスクのいずれかがInvalidOperationExceptionI can continue processing をスローした場合、スローprocessされた例外にメソッドがアクセスできるようにする必要があります。

タスク内でできることtry...catchはわかっていますが、それはハックではないようです。意味的に正しくない (タスク DID が失敗する - 正常に返されない) だけでなく、このアプローチを使用した場合、結果が成功するか例外を返す可能性があるため、カスタム型を返す必要があります。ただし、Task<T>オブジェクトは既に Exception チャネルを公開しているため、二重の義務を負わず、既に存在するものを使用することをお勧めします。

4

2 に答える 2

5

以下の例のように、このケースを処理できます。

Task<T>[] tasks  = new Task<T>[] { task1, task2, task3 };

try
{
   await Task.WhenAll(tasks);
}
catch(InvalidOperationException exception) // If you need to handle any other exception do it
{
   // handle it if you wan to 
}

// You can use task1.IsFauled to know if current task failed, 
// and you can use task1.Exception to know why it failed

return process(tasks.Where(t => !t.IsFauled).ToArray());
于 2013-04-07T00:31:46.833 に答える