2015-01-22 2 views
2

Каков наилучший подход для обработки исключения задачи, которая не выполняет функцию Wait()? Я прочитал пару блогов, в которых говорилось об использовании ContinueWith, потому что регулярный try/catch не может обрабатывать исключение Task. Ниже код не подтверждает это.Обработка исключений по задачам без ожидания()

Метод 1:

public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     var a = Task.Factory.StartNew(ThrowException); 
     return string.Format("You entered: {0}", value); 
    } 


    private void ThrowException() 
    { 
     try 
     { 

      Thread.Sleep(6000); 
      throw new ArgumentException("Hello from exception"); 
     } 
     catch (Exception) 
     { 
      Trace.WriteLine("Log it"); 
     } 

    } 
} 

Метод 2:

public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     var a = Task.Factory.StartNew(ThrowException); 
     a.ContinueWith(c => { Trace.WriteLine("Log it"); }, 
TaskContinuationOptions.OnlyOnFaulted); 
     return string.Format("You entered: {0}", value); 
    } 


    private void ThrowException() 
    { 

      Thread.Sleep(6000); 
      throw new ArgumentException("Hello from exception"); 

    } 
} 

ли способ 1 и способ 2 делает то же самое? Есть ли лучший способ реализовать это.

Редактировать: Добавлен фрагмент кода для продолжения.

+0

Вы хотите создать задачу «огонь и забыть»? –

+0

это право. Моя конечная цель состоит в том, чтобы в конце моей существующей бизнес-логики иметь метод пожара и забывания. – Faraaz

+0

Вы можете «подождать» задачу в блоке 'try/catch' и скрывать исключения. –

ответ

2

Оба метода работают, и они эквивалентны. Выберите то, что вам больше всего нравится. Преимущество, основанное на продолжении, имеет то преимущество, что вы можете превратить обработку ошибок в метод расширения (или какой-либо другой центральный помощник).

Знаете ли вы, что рабочие процессы IIS могут внезапно исчезнуть по многим причинам? В этом случае фоновая работа теряется. Или рабочие ошибки, но обработчик ошибок исчезает.

1

Похоже, что он будет работать, если вам нужно только вызвать методы в классе Trace. Тем не менее, если вам нужно пользовательские обработки исключений, я рекомендовал бы инъекционного обработчик исключений:

private void ThrowException(Action<Exception> handleExceptionDelegate) 
{ 
    try 
    { 
     // do stuff that may throw an exception 
    } 
    catch (Exception ex) 
    { 
     if (handler != null) 
      handleExceptionDelegate(ex); 
    } 
} 

Тогда вы могли бы сделать

Task.Factory.StartNew(() => 
{ 
    ThrowException((ex) => 
    { 
     // Handle Exception 
    }); 
}); 
+0

спасибо Джошу. Согласитесь с вами при инъекции обработчика исключений. Я редактировал свой вопрос с помощью ContinueWith Snippet. – Faraaz

Смежные вопросы