【发布时间】:2013-05-12 08:43:19
【问题描述】:
public class MyClass
{
MyEntities db = new MyEntities();
public MyClass()
{
this.Initialise(); // Does not return immediately. Why?
}
private async void Initialise();
{
await this.db.Entities.LoadAsync();
}
}
如果我将 Initialise 更改为使用 await Task.Run() 来调用同步的 this.db.Entities.Load() 那么它会立即按预期返回。
【问题讨论】:
-
附带说明,最好避免使用
async void。我的博客上有一些alternative approaches toasyncinitialization。 -
这个类是一个视图模型,因此包含视图的其他状态信息,例如按钮是否启用。我需要立即返回构造的对象,否则视图将处于未定义状态。 async 方法只是填充在构造视图模型时已经绑定的属性,并且数据异步显示在屏幕上。由于它是 WPF 应用程序,因此将在 UI 线程的同步上下文中捕获异常(与 Windows Phone / Windows 8 应用商店应用程序不同)。
-
我理解并重申我的建议,即您使用异步初始化方法。与
async void的唯一区别是您可以正确处理错误(甚至可以通过数据绑定处理异常情况)。 WP 和 Win8 应用程序具有与 WPF 相同的async void异常处理 - 它在 UI 线程的SyncContext上引发。但是,如果您在那里处理异常,您就是将全局解决方案应用于本地问题。
标签: .net entity-framework async-await entity-framework-6