C# 如何在backgroundworker中更改ListView?交叉线程错误
可能重复:C# 如何在backgroundworker中更改ListView?交叉线程错误,c#,winforms,delegates,C#,Winforms,Delegates,可能重复: 我在运行程序时出错。。。。 {“跨线程操作无效:从创建控件的线程以外的线程访问控件“listView1”。} private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { TestObject argumentTest = e.Argument as TestObject; string[] lines = argumentTest.ThreeValue.S
我在运行程序时出错。。。。 {“跨线程操作无效:从创建控件的线程以外的线程访问控件“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);
当您使用后台工作程序时,只需通过progress changed传递项目:
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);
}
从代码中删除最后一行(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);
}
}
这就行了,祝你好运 其思想是,除了主线程之外,您不能从任何地方更新UI。因此需要
invoke()
@nawfal我做了。。。但我仍然没有找到解决问题的办法,所以我为什么要寻求帮助……)。但是谢谢你的链接…我可以把它放在我的代码里吗?把它放在你使用列表视图的地方。以及如何添加abg.SubItems.add(IsTitle4);在那个代码里?我做这件事的时候犯了很多错误。。。