为什么异步方法会阻止MVVM Light Relay命令

时间:2016-08-22 15:18:11

标签: wpf async-await mvvm-light relaycommand

我是异步新手,需要使用拥有它的API。我已经读过我应该“一路异步”回到UI命令。到目前为止,我已经将异步传播回我的视图模型。

以下代码会阻止我的UI中的上传按钮。这是因为RelayCommand的实现使用await来调用它吗?

// 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){}

更新:Sven的评论让我发现CreateProjectAsync正在以同步写入内存的模拟模式运行。当我在Task.Run中包装该结束代码时,它不再阻止我的上传按钮。当不在模拟模式下运行时,API本机地进行异步调用以与Web服务器交互,因此这些也不会阻塞。

感谢。

1 个答案:

答案 0 :(得分:0)

await本身不会阻止您的用户界面。您的Upload()方法更有可能不会进行任何真正的异步工作。

(正如Jim所说,Task.Run()可以在这种情况下使用。它将使用线程池在后台运行操作。一般来说,对于上传/下载等IO绑定操作,你应该检查如果您的API本身支持异步调用。如果存在这样的实现,它可以比使用线程更有效地使用系统资源。)