Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# List.add()异步任务等待正确的语法_C#_.net_Asynchronous_Async Await_Xamarin.forms - Fatal编程技术网

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

C# List.add()异步任务等待正确的语法,c#,.net,asynchronous,async-await,xamarin.forms,C#,.net,Asynchronous,Async Await,Xamarin.forms,您好,我正在尝试以异步方式将项目添加到列表中,但我不确定如何进行添加,如果我使用了错误的语法,这就是我目前所拥有的: 我的看法是: await viewModel.getMessages(); list.ItemsSource = viewModel.Messages; 我的视图模型: public List<Message> Messages { get; set; } public async Task getMessages() {

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

我的看法是:

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
            });
        }
公共列表消息{get;set;}
公共异步任务getMessages()
{
等待GetRemoteMessages();
}
专用异步任务GetRemoteMessages()
{
var remoteClient=new chiesclient();
var messages=await remoteClient.getMessages().ConfigureAwait(false);
//App.Database。
wait SaveAll(消息)。configurewait(false);
}
公共异步任务SaveAll(IEnumerable\u消息)
{
foreach(消息中的变量项)
{
等待保存消息(项目);
}
}
公共异步任务保存消息(消息项)
{
等待消息。添加(新消息//无法等待作废
{
标题=项目。标题,
描述=项目。描述,
日期=项目日期,
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
        });
    }
公共列表消息{get;set;}
公共异步任务getMessages()
{
等待GetRemoteMessages();
}
专用异步任务GetRemoteMessages()
{
var remoteClient=new chiesclient();
var messages=await remoteClient.getMessages().ConfigureAwait(false);
//App.Database。
保存所有(消息);
}
公共void SaveAll(IEnumerable\u消息)
{
foreach(消息中的变量项)
{
保存消息(项目);
}
}
公共无效保存消息(消息项)
{
Messages.Add(新邮件//无法等待作废
{
标题=项目。标题,
描述=项目。描述,
日期=项目日期,
Url=item.Url
});
}
现在,
remoteClient.getMessages()
可能需要很长时间!这是一个I/O绑定任务——可能需要一毫秒,也可能需要10分钟。我们不知道,我们也不知道。如果它真的需要10分钟,我们不希望UI被锁定整个时间。当您使用
wait
关键字时,它会启动该操作,然后将控制权返回给UI。操作完成后,将继续执行方法的其余部分

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


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

这没有意义。为什么要等待将新项目添加到列表中?您可能需要查看和查找类似的内容。我不确定他们对Xamarin的使用情况如何,但我得到的印象是Xamarin有很好的覆盖范围,所以这不应该是一个问题。向列表中添加项目并不是一项可以从异步执行中获益的任务。@Selman22我需要等待web服务完成才能呈现我的listview,但是如果我没有这些项,那么就没有什么可以渲染的了,你明白我的意思了吗?当你
等待
remoteClient.getMessages()
时,你会暂停执行
GetRemoteMessages
方法,直到
getMessages()
完成。在此之后,您无需等待任何事情。