Mar*_*wen 8 .net c# exception-handling .net-4.0 task-parallel-library
我正在研究.NET 4.0中的Web Hook,它将异步运行lambda,然后在结束时将结果发布到给定的URI.
我有这个工作,但现在我希望任务处理任何抛出的异常,并发现很难阻止它们到达父级.
这是我的代码的一部分:
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;
}
Run Code Online (Sandbox Code Playgroud)
我尝试过的另一个版本调用ContinueWith()两次来注册一个继续运行OnlyOnRanToCompletion和一个运行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;
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我想要一种方法让每个Task通过延续函数处理它自己的异常.因为它代表HandlException延续函数永远不会在上面的任何一个示例中被调用.
我在测试用例中导致异常,我应该提到我Tasks.WaitAll(tasks);在一个任务数组上使用调用来确保所有任务在完成断言之前完成,并且我不确定该调用是否有所作为如何处理任务的异常.当前WaitAll抛出一个AggregationException,它聚合每个Tasks的异常,因为它们不是由HandleException continuation函数处理的.
也许,对于亨克·霍尔特曼的回答来说,顺序会产生影响。那是,
var task = new Task<T>(_startTask);
task = task.ContinueWith<T>(HandleException, TaskContinuationOptions.OnlyOnFaulted);
task = task.ContinueWith<T>(End, TaskContinuationOptions.OnlyOnRanToCompletion);
task.Start();
Run Code Online (Sandbox Code Playgroud)
将确保 HandleException 在必要时运行。
| 归档时间: |
|
| 查看次数: |
10622 次 |
| 最近记录: |