2016-08-22 9 views
0

Я новичок в 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 изначально делает асинхронные вызовы для взаимодействия с веб-сервером, поэтому они также не блокируются.

Спасибо.

+1

Ожидание не будет блокировать ваш пользовательский интерфейс. Скорее всего, ваш метод Upload() не выполняет никакой реальной асинхронной работы. Как выглядит код? –

+0

@ Свен: Вы правы. Когда я вошел в API, у него был режим симуляции (включен), который синхронно записывался в память вместо DB. Когда я завернул этот код в Task.Run, он больше не блокировал мою кнопку загрузки. Вы заставили меня найти это, поэтому, пожалуйста, отправьте свой комментарий в качестве ответа, чтобы я мог его принять. Благодаря! –

ответ

0

Сам await не будет блокировать ваш пользовательский интерфейс. Скорее всего, ваш метод Upload() не выполняет никакой реальной асинхронной работы.

(Как предложил Джим, в таком случае может использоваться Task.Run(). Он будет использовать пул потоков для выполнения операции в фоновом режиме. В общем, для операций с привязкой к IO, таких как закачки/загрузки, вы должны проверить, поддерживает асинхронные вызовы изначально. Если такая реализация существует, она может более эффективно использовать системные ресурсы, чем использование потока.)