List.add()异步任务等待正确的语法 - c#

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

我的看法:

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

我不确定我是否能正确理解整个概念,但是如何等待添加项目到清单中呢?如何做到这一点的正确方法?

参考方案

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

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

    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。您不需要异步执行该部分。

List.Add()在C#中不起作用-吸气剂和吸气剂问题? - c#

我有这个属性:public virtual List<FieldImage> Images { get; set; } 如果我去获取具有此属性的类,则使用这样的实体从数据库中获取...Field field = this.unitOfWork.FieldRepository.GetByID(Convert.ToInt32(fieldID)); 然…

List <List>混乱 - c#

我的代码段List<List<optionsSort>> stocks = new List<List<optionsSort>>(); optionsSort tempStock1 = new optionsSort(); List<optionsSort> stock = new List<…

List.addAll()何时引发IllegalStateException? - java

我有代码private List<Field> subFields; private Collection<Field> subFieldsCollection; ... try { if (subFields == null && subFieldsCollection != null && !sub…

List.OrderBy在变量中定义顺序 - c#

我有一个包含对象的列表:class MyType { String Name; String Address; DateTime BirthDay; } List<MyType> myList; 我想编写一个像这样工作的函数:public void SortList(int value) { // orderValue => this is…

List.contains()没有返回正确的结果,但是手动搜索确实 - java

我的代码发生了一个奇怪的问题: RestAPIHeader requestedBy = new RestAPIHeader("X-Requested-By", "test"); // Act RestAPIRequest req = prepareLoginRequest(USER_NAME, PASSWORD); /…