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

Why does async method block MVVM Light Relay Command

我是异步的新手,需要使用具有它的 API。我读过我应该 "go async all the way" 支持 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 服务器交互,因此这些也不会阻塞。

谢谢。

await 本身不会阻止您的 UI。您的 Upload() 方法更有可能没有执行任何真正的异步工作。

(正如吉姆所建议的,在这种情况下可以使用Task.Run()。它将使用线程池来运行在后台进行操作。一般来说,对于像IO绑定的操作uploads/downloads 你应该检查你的 API 是否原生支持异步调用。如果存在这样的实现,它可能比使用线程更有效地利用系统资源。)