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 использовать ждать Task.Run() для вызова синхронного this.db.Entities.Load(), то он сразу же возвращается, как и ожидался.асинхронного метода недействительный не возвращается немедленно (EF6)
На боковой ноте лучше избегать «async void». У меня есть несколько [альтернативных подходов к инициализации async] (http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html) в моем блоге. –
Этот класс является моделью просмотра и, следовательно, содержит другую информацию о состоянии для вида, например, включены ли кнопки. Мне нужно немедленно вернуть построенный объект или представление будет находиться в неопределенном состоянии. Метод async просто заполняет свойства, которые уже привязаны при построении модели представления, и данные появляются на экране асинхронно. Поскольку это приложение WPF, исключения будут зависеть от контекста синхронизации потока пользовательского интерфейса (в отличие от приложения Windows Phone/Windows 8 Store). – Monstieur
Я понимаю это и повторяю свое предположение, что вы используете асинхронный подход к инициализации. Единственное отличие от 'async void' заключается в том, что вы правильно обрабатываете ошибки (и можете даже обрабатывать исключительные ситуации посредством привязки данных). Приложения WP и Win8 имеют ту же обработку исключений 'async void', что и WPF, - она возникает в потоке' SyncContext' потока пользовательского интерфейса. Но если вы обрабатываете исключения, вы применяете глобальное решение локальной проблемы. –