当我在线程中遇到异常时,我遇到了问题。我的代码如下:
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 + "rn");
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() + "rn");
}
}
}
但这似乎意味着无论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() + "rn");
}
finally {
completedAdjudicationJobHandler(1);
}
}