C# 在另一个线程中将项添加到DataGrid

C# 在另一个线程中将项添加到DataGrid,c#,wpf,datagrid,C#,Wpf,Datagrid,我正在尝试使用WPF将项添加到数据网格中,使UI不会冻结 背景: 我有一个IP地址列表。对于这些IP地址,应确定更多信息,例如ping。这意味着,我检查IP列表的每一项,根据IP确定数据,并将结果插入到新列表中。此新列表的内容应显示在DataGrid中 现在是这样的,大约有4000个IP。据估计,每秒大约有15个条目将添加到DataGrid列表中。但是,只有在处理完一个列表中的所有项目并将其添加到新列表中后,才会显示该列表 我的目标是让它看起来像这样: 你有没有办法最好地解决这个问题?这是我最

我正在尝试使用WPF将项添加到数据网格中,使UI不会冻结

背景: 我有一个IP地址列表。对于这些IP地址,应确定更多信息,例如ping。这意味着,我检查IP列表的每一项,根据IP确定数据,并将结果插入到新列表中。此新列表的内容应显示在DataGrid中

现在是这样的,大约有4000个IP。据估计,每秒大约有15个条目将添加到DataGrid列表中。但是,只有在处理完一个列表中的所有项目并将其添加到新列表中后,才会显示该列表

我的目标是让它看起来像这样:

你有没有办法最好地解决这个问题?这是我最后一次尝试:

public void Get()
    {
        Task.Run(() =>
        {
            using (var client = new WebClient())
            {
                var ips = client.DownloadString("http://monitor.sacnr.com/list/masterlist.txt");

                using (var reader = new StringReader(ips))
                {
                    for (string ip = reader.ReadLine(); ip != null; ip = reader.ReadLine())
                    {
                        this.Servers.Add(this._sacnr.GetServerProperties(ip));
                    }
                }
            }
        });
    }
谢谢。

我现在这样做了

我这样调用我的方法:
Task.Factory.StartNew(()=>this.Get())

然后我用这样的方法:

public void Get()
{
    var sacnr = new SacnrConnector();

    using (var client = new WebClient())
    {
        var ips = client.DownloadString("http://monitor.sacnr.com/list/masterlist.txt");

        using (var reader = new StringReader(ips))
        {
            for (string ip = reader.ReadLine(); ip != null; ip = reader.ReadLine())
            {
                var server = sacnr.GetServerProperties(ip);

                // Here I use BeginInvoke to add elements to my ObservableCollection
                Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new ParameterizedThreadStart(AddItem), server);
            }
        }
    }
}

private void AddItem(object server)
{
    this.Servers.Add((Server)server);
}

而且它有效

这回答了你的问题吗?好的,我现在明白了,您希望UI与get函数同时更新,也就是说datagrid在检索附加的YouTube链接中显示的值时应该自动更新。您需要使用IProgress接口@Dogac已经在上面发布了一个链接。我想现在就删除我的答案。我现在尝试这样做:
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,newaction(()=>this.Get())但它仍然冻结。我保留了Get()方法的原样。我可能理解错了什么吗?使你的方法异步,并尝试在下载时等待StringAsync或ReadlineAsync,这应该可以解决问题。或者只是等待Task.run()。我会尝试所有3个选项,看看哪一个最适合。若你们想像在视频中一样更新列表,我会绑定到ObservableCollection,而不是常规列表,并在循环中添加项目。这将导致DataGrid的平滑更新,默认情况下ObservableCollection实现InotifyProperty。