Предотвратить Task.ContinueWith на исключение - PullRequest
5 голосов
/ 10 февраля 2011

Я пытаюсь помешать продолжению задачи в случае сбоя первой части.

Мой код выглядит так:

Task listener = Task.Factory.StartNew(openConnection).ContinueWith((t) => listenForNumber());

    void openConnection()
    {
        try
        {
           //stuff
        }
        catch
        {
          //morestuff
        }
    }

    void listenForNumber()
    {
       //even more stuff
    }

Теперь listenForNuber () не должен выполняться, если openConnection () входит в блок catch

Я пытался ContinueWith((t) => listenForNumber(),TaskContinuationOptions.NotOnFaulted);

Но безуспешно, можно помочь? (

Спасибо

Ответы [ 3 ]

8 голосов
/ 10 февраля 2011

TaskContiuationOptions.NotOnFaulted, очевидно, не будет иметь никакого эффекта, если только ваш метод не вышел из строя, то есть исключение, сгенерированное во время его выполнения, было обработано.

В вашем блоке catch вы должны повторно сгенерировать исключение (и сохранить трассировку стека) с помощью оператора throw; после того, как вы выполнили свою работу (возможно, некоторая очистка) - иначе исключение не будет брошен снова, поэтому ваш метод не будет считаться ошибочным.

2 голосов
/ 08 января 2012

Создайте помощник метода расширения.

public static void PropagateExceptions(this Task task)
{
    if (task == null)
        throw new ArgumentNullException("task");
    if (!task.IsCompleted)
        throw new InvalidOperationException("The task has not completed yet.");

    if (task.IsFaulted)
        task.Wait();
}

, затем вызовите метод расширения PropagateExceptions () перед выполнением любых кодов.Метод PropagateExceptions () также будет переброшен, если задача была отменена.

t1.ContinueWith(t => { 
    t.PropagateExceptions();
    listenForNumber(); 
});
1 голос
/ 10 февраля 2011

Вам нужно сгенерировать исключение в вашем методе задачи. TPL не знает, что метод завершился ошибкой, если только он не перехватывает исключение.

Вам все равно понадобится метод продолжения для ошибочного случая. Это может быть простой метод, который регистрирует исключение.

Если у вас нет метода продолжения для исключения, вы получите необработанные исключения в своем приложении, когда метод задачи выдает исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...