我的视图模型中有一个方法
private async void SyncData(SyncMessage syncMessage)
{
if (syncMessage.State == SyncState.SyncContacts)
{
this.SyncContacts();
}
}
private async Task SyncContacts()
{
foreach(var contact in this.AllContacts)
{
// do synchronous data analysis
}
// ...
// AddContacts is an async method
CloudInstance.AddContacts(contactsToUpload);
}
当我打电话时SyncData
来自 UI 命令并且我正在同步大量数据 UI 冻结。但当我打电话时SyncContacts
用这种方法
private void SyncData(SyncMessage syncMessage)
{
if (syncMessage.State == SyncState.SyncContacts)
{
Task.Run(() => this.SyncContacts());
}
}
一切安好。它们不应该是一样的吗?
我认为不使用await 来调用异步方法会创建一个新线程。
它们不应该是一样的吗?我在想不使用await for
调用异步方法会创建一个新线程。
No, async
不会神奇地为其方法调用分配一个新线程。async-await
主要是利用自然异步 API,例如对数据库或远程 Web 服务的网络调用。
当你使用Task.Run
,您显式地使用线程池线程来执行您的委托。如果您用async
关键字,但不要await
内部的任何事情都会同步执行。
我不确定你的是什么SyncContacts()
方法实际上确实如此(因为您还没有提供它的实现),但是标记它async
其本身不会给你带来任何好处。
Edit:
现在您已经添加了实现,我看到两件事:
- 我不确定同步数据分析的 CPU 密集程度如何,但这可能足以让 UI 变得无响应。
-
您没有等待异步操作。它需要看起来像这样:
private async Task SyncDataAsync(SyncMessage syncMessage)
{
if (syncMessage.State == SyncState.SyncContacts)
{
await this.SyncContactsAsync();
}
}
private Task SyncContactsAsync()
{
foreach(var contact in this.AllContacts)
{
// do synchronous data analysis
}
// ...
// AddContacts is an async method
return CloudInstance.AddContactsAsync(contactsToUpload);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)