C# 处理Task.Factory.StartNew的错误

C# 处理Task.Factory.StartNew的错误,c#,.net,task-parallel-library,task,C#,.net,Task Parallel Library,Task,当我在线程中遇到异常时,我面临这个问题。我的代码如下: Task.Factory.StartNew(() => ComputeBackgroundAdjudicationTask(taskId, ComputeBackgroundAdjudication)); private void ComputeBackgroundAdjudicationTask(long taskId, Action<int> completedAdjudicationJobHandler) {

当我在线程中遇到异常时,我面临这个问题。我的代码如下:

Task.Factory.StartNew(() => ComputeBackgroundAdjudicationTask(taskId, ComputeBackgroundAdjudication));
private void ComputeBackgroundAdjudicationTask(long taskId, Action<int> completedAdjudicationJobHandler)
{
    //My Logic           
    completedAdjudicationJobHandler(1);
}
ComputeBackgroundJudictionTask方法如下:

Task.Factory.StartNew(() => ComputeBackgroundAdjudicationTask(taskId, ComputeBackgroundAdjudication));
private void ComputeBackgroundAdjudicationTask(long taskId, Action<int> completedAdjudicationJobHandler)
{
    //My Logic           
    completedAdjudicationJobHandler(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");
         }
     }
}
private void ComputeBackgroundJudictionTask(长任务ID,Action CompletedJudictionJobHandler)
{
while(true){
试一试{
//我的逻辑
完成裁决作业处理程序(1);
}
捕获(例外情况除外){
System.IO.File.AppendAllText(@“C://test.txt”,“错误:”+ex.ToString()+“\r\n”);
}
}
}
但这似乎意味着,无论CompletedJudictionJobHandler做什么,都不是真正精心设计的

我想补充一点:如果抛出异常的东西总是抛出异常,这将导致无限循环

编辑2016-01-07:也许我又误解了想要的效果。据我所知,您想做的最后一条评论是//MyLogic,无论失败还是成功,您都希望CompletedJudictionJobHandler(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);
    }
}
private void ComputeBackgroundJudictionTask(长任务ID,Action CompletedJudictionJobHandler)
{
试一试{
//我的逻辑
}
捕获(例外情况除外){
System.IO.File.AppendAllText(@“C://test.txt”,“错误:”+ex.ToString()+“\r\n”);
}
最后{
完成裁决作业处理程序(1);
}
}

“线程没有再次启动”?你在哪里尝试再次启动“线程”?如果我将启动新线程,那么当前正在运行的线程会发生什么情况?一个好的旧样式的try-catch有什么问题?为什么您需要登录一个单独的线程?登录到同一个线程,然后返回。你能编辑我的示例并给我解决方案吗。@Prasad IMHO执行
ex.ToString()
比执行
ex.Message
要好得多,因为如果你只执行
ex.ToString(),如果你使用
ex.ToString(),你可能只会在日志中看到“发生了错误XXXXX,有关详细信息,请参阅内部异常”
它还打印内部异常及其消息(以及总是有用的堆栈跟踪)。此示例在catch(Exception ex){ex.Handle附近抛出错误(ex=>什么错误?你能给出一个更详细的错误消息吗?此外,我想强调的是,这不是一个好主意。它可能会导致线程无休止的循环。我只是想给你一个想法。@dryman,因为你正在使用
ex.Handle
你的
ex
应该是
AggregateeException
类型。这仍然是个错误尽管如此,FFLE还是让我感到困惑,因为同步代码(即
CompletedDecisionJobHandler
)不太可能抛出它。@Kirill Shlenskiy是的,我有点枯燥。编辑了这篇文章。在//我的逻辑中,我编写了int i=0;int abc=1/i;