gpt4 book ai didi

exception-handling - 如何在不抛出 TaskCanceledExceptions 的情况下等待任务?

转载 作者:行者123 更新时间:2023-12-03 11:24:13 26 4
gpt4 key购买 nike

我有一个方法可以创建一些任务,然后用 WaitAll 等待它们在返回之前。问题是,如果这些任务被取消,那么 WaitAll 会抛出 AggregateException包含大量 TaskCanceledException s。

这意味着 WaitAll 将在两种不同的情况下抛出异常:

  • 表示真正错误的异常。这意味着存在我们不知道如何处理的情况;它们需要作为未处理的异常传播,直到它们最终终止进程。
  • 指示用户单击取消按钮的异常。这意味着任务被取消和清理,程序应该继续正常运行。

  • 后者完全符合 vexing exception 的定义。 : 这是在完全非异常情况下抛出的异常,所以我必须捕获它才能恢复正常的控制流程。幸运的是,它很容易被捕获,对吧?只需添加 catch (AggregateException)并且 -- 哦等等,这与发生 fatal error 时抛出的类型相同。

    我确实需要在返回之前等待任务完成运行(我需要知道他们不再使用他们的数据库连接、文件句柄或其他任何东西),所以我确实需要 WaitAll 或类似的东西。如果任何任务出现故障,我确实希望这些异常作为未处理的异常传播。我只是不想取消异常(exception)。

    我该如何预防 WaitAll从为取消的任务引发异常?

    最佳答案

    AggregateException提供Handle可以用于这些情况的方法。例如,如果您想忽略 TaskCanceledException你可以做:

    var all = new AggregateException(
    new NullReferenceException(),
    new TaskCanceledException(),
    new TaskCanceledException(),
    new InvalidOperationException(),
    new TaskCanceledException());

    try
    {
    throw all;
    }
    catch (AggregateException errors)
    {
    errors.Handle(e => e is TaskCanceledException);
    }

    如果所有异常都是 TaskCanceledException 类型, Handle方法不会抛出任何异常;否则一个新的 AggregateException仅包含未处理的异常将被抛出。

    关于exception-handling - 如何在不抛出 TaskCanceledExceptions 的情况下等待任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8681583/

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