c# - 处理 Task.Factory.StartNew 的错误

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

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

提前致谢。

最佳答案

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

看来你要找的更多是这样的:

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 位置的事情,无论它们是失败还是成功,都需要 completedAdjudicationJobHandler(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);
    }
}

关于c# - 处理 Task.Factory.StartNew 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34635071/

相关文章:

c# - 使用 ASP.NET MVC 实现字段验证的最佳方式是什么?

c# - 什么是 ICollection?

c# - 使用 .NET 重新启动 Windows 应用程序

c# - 如何优雅地重启任务?

c# - 结果导致任务死锁

c# - 逐行读取文本文件的最快方法是什么?

c# - 在.net core 1.0 WEB API 项目中设置应用程序图标

c# - 使用 C# HttpWebRequest 将 json 发送到 web 服务

c# - 将 HttpConfigurationExtensions 添加到 ASP.NET 项目

c# - 克服共享对象线程问题的最佳解决方案