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