我想使用BackgroundWorker来为我收集一些数据,并在我的窗体中更新ListView,同时我显示一个进度条并允许gui不被冻结。 当我尝试使用BackgroundWorker更新我的ListView时,出现跨线程错误。为了克服这个问题,我在BackgroundWorker中填充一个临时ListView,并将其分配给结果,然后使用来自backgroundWorker1_RunWorkerCompleted的填充来填充我的原始ListView。如何正确使用BackgroundWorker更新ListView? [c#.NET 3.5]
#1:有没有一种更优雅的方式来更新/显示我的ListView,而无需在_RunWorkerCompleted中创建另一个临时ListView?
#2:有没有办法将原始listview作为参数传递给backgroundWorker?
我很欣赏这方面的任何反馈。
在此先感谢!
伪代码
// Original ListView in Form
ListView orginalListView = new ListView();
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
ListView backgroundList = new ListView();
foreach(var data in database)
{
listViewItem = data.value;
backgroundList.Items.Add(listViewItem);
}
e.Result = backgroundList;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Can I avoid needing to create a temp LV ??
ListView tempLV = new ListView();
tempLV = (ListView)e.Result;
foreach (ListViewItem item in tempLV.Items)
{
orginalListView .Items.Add((ListViewItem)item.Clone());
}
}
也许可以解释一下调用调用。这里有一个相关的[链接](https://msdn.microsoft.com/en-us/library/zyzhdc6b(v = vs.110).aspx)。 –
感谢您的快速反应和描述链接!我可以确认这种方法对我有用 – AlkiZaganiaris