我正在开发 .NET 4.0 中的Web Hook,它将异步运行 lambda,然后在完成后将结果发布到给定的 URI。
我已经让它工作了,但现在我希望 Task 处理抛出的任何异常,并且发现很难阻止它们到达父级。
这是我的代码的一部分:
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()
两次以注册一个 continuation to runOnlyOnRanToCompletion
和一个 to run的替代版本OnlyOnFaulted
。(我不确定调用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);
对一组任务进行调用以确保在做出断言之前所有任务都已完成,并且我不确定该调用是否有所作为任务如何处理异常。当前,WaitAll 抛出一个 AggregationException,它聚合每个任务的异常,因为它们没有被 HandleException 延续函数处理。