Существует распространенное заблуждение, что когда вы создаете метод async
, он будет фактически выполняться асинхронно (то есть в отдельном потоке).Это не так: async
и await
являются средством синхронизации уже асинхронного кода.Если у вас нет ничего, что выполняется в отдельном потоке, ваш код async
будет выполняться полностью синхронно до конца.
Поскольку getDataAsync
выполняется в том же потоке, что и конструктор MyViewModel
, вы можетезайти в тупик, так как поток ждет себя.Когда вы используете ConfigureAwait
, вы можете избежать этой ситуации.
Если вы действительно должны сделать, это другой вопрос.Что вы на самом деле делаете с ConfigureAwait
, так это запускаете задачу и позволяете ожидать продолжения в отдельном контексте (который может быть в отдельном потоке).Помимо того, что вы даже не используете await
здесь, продолжение в другом контексте может стать проблемой, если вы хотите выполнить операции пользовательского интерфейса после ожидания.
Если вы хотите быть уверены, что можетедождитесь getDataAsync
в вашем конструкторе, вы можете использовать Task.Run
для принудительного выполнения в пуле потоков:
var getDataTask = Task.Run((Func<Task>)getDataAsync);
//Do something else
getDataTask.Wait();
Все, что вы выполняете между Task.Run
и Wait()
, может выполняться во время выполненияgetDataAsync
.То, стоит ли здесь на самом деле параллелизм, зависит от того, что вы будете делать до тех пор, пока Wait()
.
То, что вы делаете в конструкторе MyViewModel
, - это окончательная синхронизация всех асинхронных операций и синхронное выполнение конструктора.,Если вы хотите выполнить эту операцию асинхронно, вам потребуется запустить другую задачу , чтобы сделать это.Таким образом, вы должны быть действительно уверены, что после этого пункта async
больше не требуется.Если это так, запустите инициализацию для другого метода async
, await getDataAsync()
там и синхронизируйте где-нибудь по цепочке вызовов.