【问题标题】:Calling async method in catch block [duplicate]在 catch 块中调用异步方法 [重复]
【发布时间】:2013-02-28 16:21:48
【问题描述】:

我在异步环境 (Silverlight) 中工作,并拥有我用来在服务器端存储异常的 Logger 服务。

考虑这段代码:

    catch (Exception ex)
    {
        this.loggerService.LogAsync(ex, "NotesService");
    }

记录器如下所示:

public interface ILoggerService
    {
        Task LogAsync(Exception ex, string tag);
    }

如果我按上述方式编写代码(即使 catch 是在异步方法中),我也无法将 await 放在那里。 如果我保持原样,我会收到警告说执行仍在继续,等等,等等。这很好,我不在乎。我只需要记录错误。

我可以直接取消这个警告,还是应该为此想出更好的模式?

【问题讨论】:

  • 如果LogAsync 完全失败,你想做什么?您可能需要一个备用计划来观察故障任务。
  • @JonSkeet 我以“吃”异常的方式对 LogAsync 进行编码 - 这是最后的手段..
  • @katit:在这种情况下,您可能需要考虑将返回类型更改为void。这非常非常很少是一个好主意,但如果你真的希望它完全“一劳永逸”,它会起作用。
  • 我对这种模式了解得越多,就会自然而然地看到“一路异步”是如何成为必需的——似乎顶级方法几乎总是无效:(
  • @katit 如果您在 GUI 环境(如 Silverlight)中并且顶部方法是事件处理程序,那么可以。如果使用 async void 确实是正确的做法,那是您不必费力思考的唯一情况。

标签: c# .net silverlight async-await


【解决方案1】:

既然您绝对确定要忽略来自LogAsync 的完成/错误,您可以执行以下简单的解决方法:

catch (Exception ex)
{
    var _ = this.loggerService.LogAsync(ex, "NotesService");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-14
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    相关资源
    最近更新 更多