私は多くのタスクが例外をスローする可能性があるタスク並列問題に取り組んでいます。Task.WhenAllで例外をスローするタスクを無視し、完了した結果のみを取得します。
正常に終了したすべてのタスクを処理し、残りのログを記録します。 Task.WaitAll
は、残りの結果を収集することなく、タスクの例外を宣伝します。残りの結果を無視してExcceptionTk
の例外を投げると
static readonly Task<string> NormalTask1 = Task.FromResult("Task result 1");
static readonly Task<string> NormalTask2 = Task.FromResult("Task result 2");
static readonly Task<string> ExceptionTk = Task.FromException<string>(new Exception("Bad Task"));
var results = await Task.WaitAll(new []{ NormalTask1,NormalTask2,ExceptionTk});
Task.Waitall
。例外を無視して結果を得る方法と例外を同時にログに記録する方法はありますか?
私はtry{...}catch(){...}
内部例外をタスクにラップできますが、私はそれらにアクセスできません。このオーバーヘッドを追加する必要はありません。
個々のタスクのステータスを確認できます。 NormalTask1とNormalTask2がRanToCompletionで、ExceptionTkがFaultedであることがわかります。 –
例外をキャッチする*のオーバーヘッドはありません。例外を頻繁に無視したい場合は、すべての結果を 'Result '型に変換して一様に扱うラッパー関数を使用できます。それは鉄道指向のプログラミングスタイルの一部です。 –
@ PanagiotisKanavosオーバーヘッドはタスクのラッピングを対象としたもので、例外をキャッチするものではありません。 –