我是异步新手,需要使用拥有它的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服务器交互,因此这些也不会阻塞。
感谢。
答案 0 :(得分:0)
await
本身不会阻止您的用户界面。您的Upload()方法更有可能不会进行任何真正的异步工作。
(正如Jim所说,Task.Run()
可以在这种情况下使用。它将使用线程池在后台运行操作。一般来说,对于上传/下载等IO绑定操作,你应该检查如果您的API本身支持异步调用。如果存在这样的实现,它可以比使用线程更有效地使用系统资源。)