如何在backgroundworker中更改ListView? 跨线程错误

可能重复:
避免交叉线程操作错误的最简洁和正确的方法?

我在运行程序时遇到错误…. {“跨线程操作无效:控制’listView1’从其创建的线程以外的线程访问。”}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { TestObject argumentTest = e.Argument as TestObject; string[] lines = argumentTest.ThreeValue.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument(); foreach (string vr in lines) { string country = argumentTest.OneValue.Trim(); string url = vr + country + '/code/' + argumentTest.TwoValue.Trim(); string sourceCode = WorkerClass.getSourceCode(url); document.LoadHtml(sourceCode); var title = document.DocumentNode.SelectSingleNode("//title"); var desc = document.DocumentNode.SelectSingleNode("//div[@class='productDescription']"); //-- eksekusi title string isititle = title.InnerText; string isititle2 = isititle.Replace("droidflashgame: ", ""); string isititle3 = Regex.Replace(isititle2, "[^A-Za-z0-9 ]+", ""); string isititle4 = isititle3.Substring(0, Math.Min(isititle3.Length, 120)); //-- Adding to list view for next step... ListViewItem abg = new ListViewItem(isititle3); abg.SubItems.Add(isititle4); listView1.Items.Add(abg); // ERROR in Here? 

我知道在一些教程中说使用invoke? 但我尝试了很多但仍然是错误的?

任何一只手?

试试这个。这对我来说很好

  ListViewItem abg = new ListViewItem(isititle3); if (listView1.InvokeRequired) listView1.Invoke(new MethodInvoker(delegate { listView1.Items.Add(abg); })); else listView1.Items.Add(abg); 

从你的代码中删除最后一行(listView1.Items.Add(abg); //这里的错误?)并将其替换为:

 AddListViewItem(abg); 

然后和你的代码这个方法:

  delegate void AddListViewItemDelegate(ListViewItem abg); void AddListViewItem(ListViewItem abg) { if (this.InvokeRequired) { AddListViewItemDelegate del = new AddListViewItemDelegate(AddListViewItem); this.Invoke(del, new object() { abg }); } else { listView1.Items.Add(abg); } } 

这将完成工作,快乐编码!

当您使用后台工作程序时,您只需通过更改的进度传递项目:

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { //.......... var test = new ListViewItem("test"); backgroundWorker1.ReportProgress(0, test); } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { listView1.Items.Add((ListViewItem)e.UserState); }