【发布时间】: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