处理Task.Factory.StartNew的错误

时间:2016-01-06 14:04:49

标签: c# .net task-parallel-library task

我在线程中遇到异常时遇到问题。我的守则如下:

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

和ComputeBackgroundAdjudicationTask方法如下:

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

现在我面临的问题是在我的逻辑中假设有一些异常即将到来我想要登录一些文本文件。 我在网上搜索后发现一些答案如下。

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 个答案:

答案 0 :(得分: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");
         }
     }
}

但是看起来好像完成的AdjudicationJobHandler并没有做得好。

我想补充一点:如果抛出异常将始终抛出异常,这将导致无限循环。

编辑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);
    }
}