. NET Когда задача считается ошибочной? - PullRequest
1 голос
/ 04 апреля 2020

Я новичок в TPL, и мне интересно, когда у вас есть подобное:

Task.Run(() =>{
  // Some code here to call several APIs...
});

Когда эта задача считается ошибочной? Когда внутри них возникает исключение, которое не перехватывается?

И можете ли вы вручную установить эту задачу как невыполненную? Например, если вы перехватываете исключение, вы хотите, чтобы эта задача не выполнялась, чтобы задачи продолжения не выполнялись?

Спасибо за помощь

1 Ответ

2 голосов
/ 04 апреля 2020

Да, исключения вызывают состояние сбоя (за исключением случаев, когда выбрасывается OperationCancelledException, тогда его свойство IsCanceled становится истинным).

Невозможно установить задачу непосредственно в сбой, кроме случаев использования TaskCompletitionSource источник напрямую с помощью метода .SetException.

Но какая у вас проблема с выдачей исключения? После обработки исключения вы можете просто выбросить его

Task.Run(() =>{
    try
    {
        DoSomething();
    }
    catch(InvalidOperationException ex)
    {
        logging.Error("Something went wrong", ex);

        // rethrow the same exception. 
        // Don't do: "throw ex" as it changes stack trace, making debugging harder
        throw;
    }
});

В качестве альтернативы использовать C# 6.0 , когда язык конструирует для ведения журнала.

Task.Run(() =>{
    try
    {
        DoSomething();
    }
    catch(InvalidOperationException ex) when (LogException(ex))
    {
    }
});

...
private bool LogException(ex)
{
    logging.Error("Something went wrong", ex);

    // returning true means, exception block will be executed
    // returning false means, exception block won't be executed
    return false;
}

Таким образом, ведение журнала будет выполнено, но само исключение не будет перехвачено (и будет перехвачено ожидающей задачей.

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