以下は、.net 4.0 で C# winforms アプリケーションを操作しています。
並行して実行されるタスクのリストがあります。それらの実行が完了すると、実行したいコードのブロックがあります (後処理の検証に関連します)。いずれかのタスクが失敗した場合は、例外がコール スタックを UI レベルまでフローするようにします (呼び出す必要があるグローバル例外ハンドラーがあります)。
ContinueWhenAll がブロッキング メソッドではないことを理解しています。また、ContinueWhenAll が新しいタスクを開始していることも知っています。しかし、このタスクを UI と同じスレッドで実行することはできないようです。デバッグとして実行すると、例外が表示されます。ただし、デバッグを行わないと、Continue されたタスクは独自のスレッドで失敗し、例外は処理されずに失われます。
TaskContinuationOptions.ExecuteSynchronouslyの使用が原因だと思います(MSDNの「継続は、先行タスクを最終状態に移行させる同じスレッドで実行されます」 )。UIスレッドで実行を強制できる方法はありますか? それとも、仕事に間違ったツールを使用していますか?
//Being called in the UI thread
var tasks = new List<Task>();
foreach (var item in workList)
{
tasks.Add(item.DoWorkAsync);
}
var context = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.ContinueWhenAll(tasks.ToArray(), LoadComplete, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, context);
...
private void LoadComplete(Task[] tasks)
{
var errors = (from t in tasks where t.Exception != null select t.Exception);
if (errors.Count() > 0)
throw new AggregateException(errors.ToArray());
}