【问题标题】:List.add() async task await correct syntaxList.add() 异步任务等待正确的语法
【发布时间】:2014-09-07 15:52:54
【问题描述】:

您好,我正在尝试将项目异步添加到列表中,但我不确定它是如何完成的,如果我使用了不正确的语法,这就是我目前所拥有的:

我的观点:

await viewModel.getMessages();
list.ItemsSource = viewModel.Messages;

我的视图模型:

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
            });
        }

我不确定我的整个概念是否正确,但我如何才能等待将项目添加到我的列表中?这样做的正确方法是什么?

【问题讨论】:

  • 这没有意义。为什么要等待将新项目添加到列表中?
  • 您可能需要查看 TPLRX 以获取类似的信息。我不确定他们与 Xamarin 配合得如何,但我觉得 Xamarin 的覆盖范围非常好,所以这应该不是问题。
  • 将项目添加到列表不是一项可以从异步执行中看到任何好处的任务。
  • @Selman22 我需要等待 Web 服务完成才能呈现我的列表视图,但如果我没有这些项目,那么就没有什么可呈现的,你明白我的意思吗?
  • 当您 await remoteClient.getMessages() 时,您将暂停执行 GetRemoteMessages 方法,直到 getMessages() 完成。在那之后你不需要await 任何东西。

标签: c# .net asynchronous async-await xamarin.forms


【解决方案1】:

您不想要将项目异步添加到列表中——这并没有真正的好处。

您的代码很好,您只需在从远程服务获取消息后同步执行所有操作。

    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 绑定任务——它可能需要一毫秒,也可能需要 10 分钟。我们不知道,也无法知道。如果它确实最终需要 10 分钟,我们不希望 UI 一直被锁定。当您使用 await 关键字时,它会启动该操作,然后将控制权交还给 UI。操作完成后,将继续执行该方法的其余部分。

您正在处理的原始示例将内容保存到数据库。这是另一个 I/O 绑定操作,因此数据库 API 创建者为您提供了一些异步 API 来帮助您解决这个问题。

您正在修改示例以将结果放入列表中。添加到列表不是 I/O 绑定操作。事实上,它几乎是瞬时的。因此,它没有异步 API。您不需要异步执行该部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2014-09-06
    • 2013-02-10
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多