Task.Factory.StartNew的句柄错误

本文关键字:句柄 错误 StartNew Factory Task | 更新日期: 2023-09-27 18:29:14

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

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
);

现在它正在登录到文本文件中。登录到文本文件后,线程不会再次启动。请帮我解决这个问题。

提前感谢。

Task.Factory.StartNew的句柄错误

在您的示例中,异常终止任务/线程,然后记录线程终止的原因。

你正在寻找的似乎更多的是这种:

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");
         }
     }
}

但这似乎意味着无论JobHandler完成了什么,都不是设计得很好。

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

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