我想知道如果我在没有使用await的情况下调用标记为async的方法会发生什么。考虑这个例子:
private int id = 0;
async Task Initialize()
{
var content = await LoadFromDisk(id);
await Process(content);
return;
}
DataId
{
get { return id; }
set { id = value; Initialize(); }
}
我知道这会产生编译警告,但我的问题是,如果在Initialize()中等待的方法调用仍然可以像预期的那样工作。正如您所看到的那样,setter不需要等待Initialize(),因为没有返回值,它是属性的setter的最后一次调用。这是一种火,忘了。
我想这样做的原因是我想将MVVM和数据后端结合起来,迫使我使用异步方法。
在上面的示例中,用户从列表中选择一个条目,程序应该在视图的另一部分显示有关该条目的详细信息。
我想将列表中当前选定的条目绑定到DataId,每当用户更改选择时,它都会更新详细信息视图。当然,可以从事件处理程序执行异步方法调用,但我想避免使用事件处理程序以实现更清晰的MVVM实现(主要使用数据绑定)。
答案 0 :(得分:13)
如果在不等待任务的情况下调用async Task
方法,则会默默忽略该方法的任何异常。如果您调用async void
方法(您在问题标题中提及,但您的代码不正在做),那么该方法的任何异常都将在{{1在这种情况下,直接发送到UI主循环。
我在asynchronous properties.上有一篇博客文章。最后一节介绍NotifyTaskCompletion
type,它专为异步数据绑定而设计。