【问题标题】:C# AggregateException, in what scenario would I have aggregated exceptions?C# AggregateException,在什么情况下我会聚合异常?
【发布时间】:2019-10-30 13:43:14
【问题描述】:

我可能遗漏了一个非常明显的事实,但我很难理解对 AggregatedExceptions 的需求。

我知道,自从 async/await 之后,我们就不必再为 AggregatedExceptions 烦恼了(或者至少不那么频繁地遇到它们了)。我可以理解这一点,因为我只是启动一个任务,有时我选择将“调用线程”与“并行运行的任务”同步

var sometTask = DoSomethingInParallelAsync().ConfigureAwait(false);
...
...
await someTask;

在这种情况下,DoSomethingInParallelAsync() 中发生的异常将在我等待该调用时显示给我。

为什么不使用await,而在Task 上显式使用Wait 会如此不同?

var someTask = DoSomethingInParallelAsync();
...
...
someTask.Wait();

本例中抛出的异常,总是将抛出的Exception 包裹在AggregateException 中。我还是不明白为什么。

在使用 async/await 时我不能做什么,这消除了对 AggregateExceptions 的需求?

【问题讨论】:

  • 嗨@Sean,感谢您的链接。不过还是很疑惑。在下面给出的示例中,我了解多个异常可能同时发生在不同的线程/任务上。但在我的问题中,我只是启动 1 个任务,然后等待它。这不会在Task.Wait 调用上产生多个异常。那为什么还包裹在AggregateException中呢?
  • 不确定我是否清楚。我会理解Task.WhenAll 会抛出一个AggregateException,我不明白为什么Task.Wait 会抛出一个AggregateException

标签: c# aggregateexception


【解决方案1】:

错误的原因和处理

Task task1 = Task.Factory.StartNew(() => { throw new ArgumentException(); } );
Task task2 = Task.Factory.StartNew(() => { throw new UnauthorizedAccessException(); } );

try
{
    Task.WaitAll(task1, task2);
}
catch (AggregateException ae)
{
}

还看到links

这是一个例子:link2

【讨论】:

  • 好的,这确实解释了AggregateException 存在的原因。但这并不能真正向我解释为什么Task.Wait 调用会将异常包装在AggregateException 中。在什么情况下,您可以在单个任务上产生多个异常?这只是一项任务,只有一个结果,对吧?因异常而失败或成功完成。 PS:我也不明白谁对你的答案投了反对票……
猜你喜欢
  • 2016-10-23
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多