Я новичок в async и должен использовать API, который имеет его. Я читал, что должен «переходить на асинхронный путь полностью» обратно в пользовательский интерфейс. До сих пор я распространял async обратно в мою модель представления.Почему блок асинхронного метода MVVM Light Relay Command
Код ниже блокирует кнопку «Загрузить» в моем пользовательском интерфейсе. Это потому, что реализация RelayCommand вызывает его с помощью ожидания?
// In the ViewModel:
public MyViewModel()
{
...
UploadRelayCommand = new RelayCommand(mUpload,() => CanUpload);
...
}
private async void mUpload()
{
...
await mModel.Upload();
...
}
// In the model:
public async Task UploadToDatabase()
{
...
projectToUse = await api.CreateProjectAsync(ProjectName);
...
}
// In the API
public async Task<Project> CreateProjectAsync(Project project){}
Обновление: комментарий Свена привело меня найти, что CreateProjectAsync был запущен в режиме симуляции, которые синхронно написал в память. Когда я завернул этот код в Task.Run, он больше не блокировал мою кнопку загрузки. Когда он не работает в режиме моделирования, API изначально делает асинхронные вызовы для взаимодействия с веб-сервером, поэтому они также не блокируются.
Спасибо.
Ожидание не будет блокировать ваш пользовательский интерфейс. Скорее всего, ваш метод Upload() не выполняет никакой реальной асинхронной работы. Как выглядит код? –
@ Свен: Вы правы. Когда я вошел в API, у него был режим симуляции (включен), который синхронно записывался в память вместо DB. Когда я завернул этот код в Task.Run, он больше не блокировал мою кнопку загрузки. Вы заставили меня найти это, поэтому, пожалуйста, отправьте свой комментарий в качестве ответа, чтобы я мог его принять. Благодаря! –