私は.NET 4.0でラムダを非同期に実行し、終了時に結果を特定のURIに投稿するWebフックに取り組んでいます。
私はそれを機能させましたが、スローされた例外をタスクで処理したいので、それらが親に到達するのを止めるのが難しいと感じています。
ここに私のコードの一部があります:
private readonly Func<T> _startTask;
private readonly string _responseUri;
public Task<T> Begin()
{
var task = new Task<T>(_startTask);
task.ContinueWith<T>(End);
task.Start();
return task;
}
private T End(Task<T> task)
{
if (task.IsFaulted)
{
return HandleException(task);
}
var result = task.Result;
WebHookResponse.Respond(result, _responseUri);
return result;
}
private T HandleException(Task<T> task)
{
WebHookResponse.HandleException(task.Exception.InnerException, _responseUri);
return null;
}
私が試した別のバージョンではContinueWith()
、実行する継続と実行する継続を登録するために 2 回呼び出しOnlyOnRanToCompletion
を行いましたOnlyOnFaulted
。(2回呼び出すContinueWith()
のが正しいかどうかはわかりません。):
public Task<T> Begin()
{
var task = new Task<T>(_startTask);
task.ContinueWith<T>(End, TaskContinuationOptions.OnlyOnRanToCompletion);
task.ContinueWith<T>(HandleException, TaskContinuationOptions.OnlyOnFaulted);
task.Start();
return task;
}
private T End(Task<T> task)
{
var result = task.Result;
WebHookResponse.Respond(result, _responseUri);
return result;
}
private T HandleException(Task<T> task)
{
WebHookResponse.HandleException(task.Exception.InnerException, _responseUri);
return null;
}
したがって、基本的には、各タスクが継続関数を介して独自の例外を処理する方法が必要です。現状では、HandlException 継続関数は上記のいずれの例でも呼び出されていません。
私はテスト ケースで例外を引き起こしていますTasks.WaitAll(tasks);
。アサーションを行う前にすべてのタスクが完了していることを確認するために、Task の配列に対する呼び出しを使用していることに言及する必要があります。その呼び出しが違いを生むかどうかはわかりません。タスクによる例外の処理方法。現在、WaitAll は、HandleException 継続関数によって処理されていないため、各タスクの例外を集約する AggregationException をスローします。