2016-01-06 2 views
2

У меня возникла проблема, когда я получил исключение в потоковом режиме. Мой код выглядит следующим образом:Ошибка обработки для Task.Factory.StartNew

Task.Factory.StartNew(() => ComputeBackgroundAdjudicationTask(taskId, ComputeBackgroundAdjudication)); 

И метод ComputeBackgroundAdjudicationTask выглядит следующим образом:

private void ComputeBackgroundAdjudicationTask(long taskId, Action<int> completedAdjudicationJobHandler) 
{ 
    //My Logic   
    completedAdjudicationJobHandler(1); 
} 

Теперь то, что IAM сталкивается с проблемой в моей логике предположим, некоторые исключения приходят я хочу, чтобы войти в какой-нибудь текстовый файл. После того как я обыскал в сети, я нашел ответ следующим образом.

Task.Factory.StartNew(() =>ComputeBackgroundAdjudicationTask(taskId, ComputeBackgroundAdjudication)) 
.ContinueWith(
    task => 
    { 
     if (task.Exception != null) 
      task.Exception.Handle(ex => 
      { 
       System.IO.File.AppendAllText(@"C://test.txt", "Error:" + ex.Message + "\r\n"); 
       return true; 
      }); 
    }, TaskContinuationOptions.OnlyOnFaulted 
); 

Теперь его вход в текстовый файл. После входа в текстовый файл поток не запускается снова. Пожалуйста, помогите мне исправить это.

Спасибо заранее.

+1

"The thread is not again again"? Где вы пытаетесь снова запустить «поток»? – Luaan

+0

Если я начну новый поток, что произойдет с текущей текущей нитью? – Prasad

+0

Что случилось с добрым старым fashined try catch? Зачем вам нужно входить в отдельный поток? Войдите в тот же поток, затем вернитесь. – Liam

ответ

1

В вашем примере исключение завершает задачу/поток, после чего вы регистрируете причину завершения потока.

Кажется, что вы ищете больше такого рода:

private void ComputeBackgroundAdjudicationTask(long taskId, Action<int> completedAdjudicationJobHandler) 
{ 
    while(true) { 
     try { 
      //My Logic   
      completedAdjudicationJobHandler(1); 
     } 
     catch(Exception ex) { 
      System.IO.File.AppendAllText(@"C://test.txt", "Error:" + ex.ToString() + "\r\n"); 
     } 
    } 
} 

Но это, кажется, как будто все, что completedAdjudicationJobHandler это не очень хорошо продуманы.

Я хочу добавить: если какие-либо исключения исключение всегда будет вызывать исключение, это приведет к бесконечному циклу.

Редактировать 2016-01-07: Возможно, я снова неправильно понял желаемый эффект. Поскольку я понимаю последний комментарий, который вы хотите сделать, написанные на позиции // MyLogic, и были ли они неудачными или успешными, хотите завершитьAdjudicationJobHandler (1); казнены. В этом случае пример кода будет следующим:

private void ComputeBackgroundAdjudicationTask(long taskId, Action<int> completedAdjudicationJobHandler) 
{ 
    try { 
     //My Logic 
    } 
    catch(Exception ex) { 
     System.IO.File.AppendAllText(@"C://test.txt", "Error:" + ex.ToString() + "\r\n"); 
    } 
    finally { 
     completedAdjudicationJobHandler(1); 
    } 
} 
+0

Этот пример вызывает ошибку вблизи catch (Exception ex) { ex. Handle (ex => – Prasad

+0

Какая ошибка? Можете ли вы дать более подробное сообщение об ошибке? Кроме того, я хочу подчеркнуть, что это не очень хорошая идея. Это может привести к потокам с бесконечным циклом. Просто хотел дать вам идею. – dryman

+0

@dryman, видя, что вы используете 'ex.Handle', ваш' ex' должен был, вероятно, иметь тип 'AggregateException'. Это все еще меня озадачивает, хотя в качестве синхронного кода (то есть' completeAdjudicationJobHandler') вряд ли будет бросать Это. –

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