List.add() async task等待正确语法
本文关键字:等待 语法 task async add List | 更新日期: 2023-09-27 18:13:13
你好,我正试图将项目异步添加到列表中,但我不确定它是如何完成的,如果我使用不正确的语法,这就是我目前所拥有的:
我的观点:
await viewModel.getMessages();
list.ItemsSource = viewModel.Messages;
My View Model:
public List<Message> Messages { get; set; }
public async Task getMessages()
{
await GetRemoteMessages();
}
private async Task GetRemoteMessages()
{
var remoteClient = new ChiesiClient();
var messages = await remoteClient.getMessages().ConfigureAwait(false);
//App.Database.
await SaveAll(messages).ConfigureAwait(false);
}
public async Task SaveAll(IEnumerable<Message> _messages)
{
foreach (var item in _messages)
{
await SaveMessage(item);
}
}
public async Task SaveMessage(Message item)
{
await Messages.Add(new Message // Cannot await void
{
Title = item.Title,
Description = item.Description,
Date = item.Date,
Url = item.Url
});
}
我不确定我是否得到了整个概念的权利,但我怎么能等待添加项目到我的列表?怎么做才是正确的呢?
您不会希望异步地将项添加到列表中——这样做没有实际的好处。
你的代码很好,你只需要在从远程服务获得消息后同步地做所有的事情。
public List<Message> Messages { get; set; }
public async Task getMessages()
{
await GetRemoteMessages();
}
private async Task GetRemoteMessages()
{
var remoteClient = new ChiesiClient();
var messages = await remoteClient.getMessages().ConfigureAwait(false);
//App.Database.
SaveAll(messages);
}
public void SaveAll(IEnumerable<Message> _messages)
{
foreach (var item in _messages)
{
SaveMessage(item);
}
}
public void SaveMessage(Message item)
{
Messages.Add(new Message // Cannot await void
{
Title = item.Title,
Description = item.Description,
Date = item.Date,
Url = item.Url
});
}
现在,remoteClient.getMessages()
可能需要很长时间!这是一个I/O绑定任务——可能需要1毫秒,也可能需要10分钟。我们不知道,也不可能知道。如果它最终花了10分钟,我们不希望UI整个时间都被锁定。当您使用await
关键字时,它将启动该操作,然后将控制权交还给UI。操作完成后,继续执行方法的其余部分。
您正在处理的原始示例将内容保存到数据库中。这是另一个I/O绑定操作,因此数据库API创建者友好地为您提供了一些异步API来帮助解决这个问题。
您正在修改示例以将结果放入列表中。添加到列表不是一个I/O绑定操作。事实上,这几乎是瞬间发生的。因此,它没有异步API。