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方法不立即返回(EF6)
在附註上,最好避免使用「async void」。我在我的博客上有一些[用於'async'初始化的替代方法](http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html)。 –
該類是一個視圖模型,因此包含視圖的其他狀態信息,例如是否啓用按鈕。我需要立即返回構造對象,否則視圖將處於未定義狀態。 async方法只是填充構建viewmodel時已綁定的屬性,並且數據異步出現在屏幕上。由於它是一個WPF應用程序,異常將會在UI線程的同步上下文中捕獲(與Windows Phone/Windows 8 Store應用程序不同)。 – Monstieur
我明白並重申我的建議,即使用異步初始化方法。與'async void'唯一的區別是,你可以正確處理錯誤(甚至可以通過數據綁定處理異常情況)。 WP和Win8應用程序與WPF具有相同的「async void」異常處理,它會在UI線程的SyncContext中引發。但是,如果您處理例外情況,那麼您正在爲本地問題應用全局解決方案。 –