2016-01-06 82 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

“线程不再启动”?你在哪里试图再次启动“线程”? – Luaan

+0

如果我将启动新线程,那么当前正在运行的线程会发生什么? – Prasad

+0

一个很好的旧时髦尝试抓住什么是错的?为什么你需要登录一个单独的线程?登录相同的线程然后返回。 – 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的位置,并且他们是否失败或成功,您希望完成的是成就决策作业(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

这个例子会引发错误(例外ex){例如。处理(ex => – Prasad

+0

)什么错误?你能给出更详细的错误信息吗?除此之外,我想强调这不是个好主意,它可以导致线程无限循环。 只想给你一个想法。 – dryman

+0

@dryman,在你使用'ex.Handle'时看到你的'ex'应该可能是'AggregateException'类型,尽管同步代码(即'completedAdjudicationJobHandler')不太可能抛出它。 –