Я хочу Задачу обработать любые исключения, которые выдаются, но нахожу трудным мешать им достигнуть родителя

Я работаю над веб-Рычагом в.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.

8
задан Martin Owen 2 June 2012 в 06:32
поделиться