gpt4 book ai didi

c# - 将任务异常标记为已处理

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:22 26 4
gpt4 key购买 nike

如何将任务中抛出的异常标记为已处理。问题是当我调用任务的 Wait() 方法时,即使我已经处理了 AggregateException 也会抛出 AggregateException很久以前。以下代码片段显示了我要解决的问题。在我的原始代码中,我在代码的一部分处理 AggregateException 并在代码的另一部分调用 Wait() 方法。但问题是一样的。

static void Main(string[] args)
{
Task task = null;

try
{
task = new Task(() =>
{
Console.WriteLine("Task started");
Thread.Sleep(1000);
throw new InvalidOperationException("my test exception");
});

task.ContinueWith(t =>
{
Console.WriteLine("Task faulted");
AggregateException ae = t.Exception;
ae.Flatten().Handle(ex =>
{
if (typeof(InvalidOperationException) == ex.GetType())
{
Console.WriteLine("InvalidOperationException handled --> " + ex.Message);
return true;
}

return false;
});
}, TaskContinuationOptions.OnlyOnFaulted);

task.Start();
Thread.Sleep(2000);
task.Wait();
}
catch (AggregateException ae)
{
Console.WriteLine("AggregateException thrown again!!! Why???");
ae.Flatten().Handle(ex =>
{
Console.WriteLine(ex.Message);
return true;
});
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

Console.WriteLine("Finished");
Console.Read();
}

上面的代码产生以下输出:

  • 任务开始
  • 任务失败
  • 已处理 InvalidOperationException --> 我的测试异常
  • AggregateException 再次抛出!!!为什么???
  • 我的测试异常
  • 完成

最佳答案

当错误任务被Wait时,异常会被重新抛出。如果只是偶尔抛出异常,那将是不可靠的设计。

但是,如果您正在添加一个处理异常的延续,并且您不希望它再次抛出,那么就不要再次Wait 该任务。 Wait 继续任务(您当前未使用)。它只会在原始任务完成后完成,如果您需要结果,只需让继续返回该结果即可。这样异常只会被处理一次:

Task continuation = task.ContinueWith(t => 
{
Console.WriteLine("Task faulted");
AggregateException ae = t.Exception;
ae.Flatten().Handle(ex =>
{
if (typeof(InvalidOperationException) == ex.GetType())
{
Console.WriteLine("InvalidOperationException handled --> " + ex.Message);
return true;
}

return false;
});
}, TaskContinuationOptions.OnlyOnFaulted);

task.Start();
Thread.Sleep(2000);
continuation.Wait();

注意:当原始任务没有抛出异常时,这将抛出一个 TaskCanceledException,因为继续被取消(由于 TaskContinuationOptions.OnlyOnFaulted)。为避免这种情况,只需删除标志并检查是否 t.IsFaulted

关于c# - 将任务异常标记为已处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27178815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com