Я работаю над веб-Рычагом в.NET 4.0, который выполнит лямбду асинхронно и затем отправит результат на данный URI, когда это будет закончено.
У меня есть это для работы, но теперь я хочу Задачу обработать любые исключения, которые выдаются, и нахожу трудным мешать им достигнуть родителя.
Вот часть моего кода:
private readonly Func _startTask;
private readonly string _responseUri;
public Task Begin()
{
var task = new Task(_startTask);
task.ContinueWith(End);
task.Start();
return task;
}
private T End(Task task)
{
if (task.IsFaulted)
{
return HandleException(task);
}
var result = task.Result;
WebHookResponse.Respond(result, _responseUri);
return result;
}
private T HandleException(Task task)
{
WebHookResponse.HandleException(task.Exception.InnerException, _responseUri);
return null;
}
Альтернативная версия, что я попробовал вызовы ContinueWith()
дважды зарегистрировать одно продолжение для выполнения OnlyOnRanToCompletion
и один для выполнения OnlyOnFaulted
. (Я не уверен при вызове ContinueWith()
дважды корректно.):
public Task Begin()
{
var task = new Task(_startTask);
task.ContinueWith(End, TaskContinuationOptions.OnlyOnRanToCompletion);
task.ContinueWith(HandleException, TaskContinuationOptions.OnlyOnFaulted);
task.Start();
return task;
}
private T End(Task task)
{
var result = task.Result;
WebHookResponse.Respond(result, _responseUri);
return result;
}
private T HandleException(Task task)
{
WebHookResponse.HandleException(task.Exception.InnerException, _responseUri);
return null;
}
Так в основном я хочу путь к каждой Задаче, обрабатывают ее собственные исключения через функцию продолжения.как есть Функция продолжения HandlException никогда не вызывается ни в одном из вышеупомянутых примеров.
Я вызываю исключения в тестовом сценарии, и я должен упомянуть, что использую a Tasks.WaitAll(tasks);
обратитесь к массиву Задач удостовериться, что все задачи завершены прежде, чем сделать мои утверждения, и я не уверен, имеет ли тот вызов значение к тому, как исключения обработаны Задачами. В настоящее время WaitAll бросает AggregationException, который агрегировал исключения для каждой из Задач, потому что они не обрабатываются функцией продолжения HandleException.