如何在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); }
- 如何确定在构建或运行时是否使用PostSharp方面修饰了类
- 在C#/ .NET WebBrowser控件中,SSL / TLS / HTTPS站点非常慢,但在Internet Explorer中却很好
- “此应用程序无法启动。”仅当文件位于system32目录中时
- RichTextBox控件中的损坏表(自动换行)
- 设置ViewStateUserKey会给我一个“viewstate MAC failed的validation”错误
- 是否有类似于hawkeye的UI检查工具与.net 4.5一起使用?
- 如何控制winform mschart图例文本对齐c#?
- 如何使用Ping.SendAsync与datagridview一起使用?
- 如何避免子类的工厂方法中的switch-case