Mar*_*ván 4 .net c# asynchronous async-await xamarin.forms
您好我试图异步添加项目到列表但我不知道它是如何完成的,如果我使用的语法不正确,这就是我现在所拥有的:
我的看法:
await viewModel.getMessages();
list.ItemsSource = viewModel.Messages;
Run Code Online (Sandbox Code Playgroud)
我的视图模型:
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
});
}
Run Code Online (Sandbox Code Playgroud)
我不确定我是否正确地使用了整个概念,但我如何等待将项目添加到我的列表中?这样做的正确方法是怎样的?
Dan*_*ann 11
您不希望异步地将项添加到列表中 - 它没有真正的好处.
您的代码很好,您只需要在从远程服务收到消息后同步执行所有操作.
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
});
}
Run Code Online (Sandbox Code Playgroud)
现在,remoteClient.getMessages()可能需要很长时间!这是一个I/O绑定任务 - 可能需要一毫秒,或者可能需要10分钟.我们不知道,也无法知道.如果它实际上最终耗时10分钟,我们不希望UI整个时间都被锁定.当您使用await关键字时,它会启动该操作,然后将控制权交还给UI.操作完成后,继续执行该方法的其余部分.
您正在处理的原始示例将内容保存到数据库中.这是另一个I/O绑定操作,因此数据库API创建者为您提供了一些异步API以帮助解决这个问题.
您正在修改示例以将结果放入列表中.添加到列表不是I/O绑定操作.事实上,它几乎是瞬间完成的.因此,它没有异步API.您不需要异步执行该部分.
| 归档时间: |
|
| 查看次数: |
8588 次 |
| 最近记录: |