【问题标题】:What happens when calling an async method without await?在没有等待的情况下调用异步方法会发生什么?
【发布时间】:2014-02-18 16:45:50
【问题描述】:

我想知道如果我调用一个标记为异步的方法而不使用等待会发生什么。考虑这个例子:

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(),因为没有返回值,并且它是属性设置器的最后一次调用。这有点像火了然后忘记了。

我想这样做的原因是我想将 MVVM 和迫使我使用异步方法的数据后端结合起来。

在上面的示例中,用户从列表中选择一个条目,程序应在视图的另一部分显示有关该条目的详细信息。

我想将列表中当前选择的条目绑定到 DataId,只要用户更改选择,它就会更新详细视图。当然,可以从事件处理程序执行异步方法调用,但为了更简洁的 MVVM 实现(主要使用数据绑定),我想避免使用事件处理程序。

【问题讨论】:

  • 我很困惑,你说的async方法没有await,但是你的Initialize()不是async,但确实包含await,它不会编译。
  • 抱歉,忘记了 async 关键字。我已经在帖子中修复了它。

标签: c# mvvm asynchronous windows-store-apps async-await


【解决方案1】:

如果您在没有等待任务的情况下调用async Task 方法,则该方法的任何异常都将被静默忽略。如果您调用 async void 方法(您在问题标题中提到,但您的代码没有这样做),那么该方法的任何异常都将在 SynchronizationContext 上重新引发 - 在本例,直接发送到 UI 主循环。

我有一篇关于asynchronous properties. 的博文 最后一节介绍了NotifyTaskCompletion type,它是专为异步数据绑定而设计的。

【讨论】:

  • 谢谢!我想我会使用NotifyTaskCompletion
猜你喜欢
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 2019-07-27
  • 2020-08-22
  • 2013-07-22
  • 1970-01-01
相关资源
最近更新 更多