【发布时间】:2016-12-29 05:20:40
【问题描述】:
我是异步的新手,需要使用具有它的 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 服务器交互,因此这些调用也不会阻塞。
谢谢。
【问题讨论】:
-
await 本身不会阻塞你的 UI。您的 Upload() 方法更有可能没有执行任何真正的异步工作。代码是什么样的?
-
@Sven:你是对的。当我进入 API 时,它有一个模拟模式(打开),同步写入内存而不是数据库。当我将该结束代码包装在 Task.Run 中时,它不再阻止我的上传按钮。您让我找到了这个,所以请重新发布您的评论作为答案,以便我接受。谢谢!
标签: wpf async-await mvvm-light relaycommand