.net 如何在DoWork事件处理程序中使用UI线程的列表视图?
我在UI线程上有listview。我有一些操作要通过后台工作人员的DoWork事件处理程序执行,因为它们很耗时。但是我无法访问DoWork处理程序中的listview项,因为它引发了一个异常:.net 如何在DoWork事件处理程序中使用UI线程的列表视图?,.net,listviewitem,.net,Listviewitem,我在UI线程上有listview。我有一些操作要通过后台工作人员的DoWork事件处理程序执行,因为它们很耗时。但是我无法访问DoWork处理程序中的listview项,因为它引发了一个异常:跨线程操作无效:控件“bufferedListView1”是从创建它的线程以外的线程访问的。 那么,如何在DoWork事件处理程序中访问bufferedlistview呢。 这是DoWork中要处理的代码: foreach (ListViewItem item in bufferedListView1.It
跨线程操作无效:控件“bufferedListView1”是从创建它的线程以外的线程访问的。
那么,如何在DoWork事件处理程序中访问bufferedlistview呢。
这是DoWork中要处理的代码:
foreach (ListViewItem item in bufferedListView1.Items)
{
string lname = bufferedListView1.Items[i].Text;
string lno = bufferedListView1.Items[i].SubItems[1].Text;
string gname = bufferedListView1.Items[i].SubItems[2].Text;
string line = lname + "@" + lno + "@" + gname;
if (gname.Contains(sgroup))
{
var m = Regex.Match(line, @"([\w]+)@([+\d]+)@([\w]+)");
if (m.Success)
{
port.WriteLine("AT+CMGS=\"" + m.Groups[2].Value + "\"");
port.Write(txt_msgbox.Text + char.ConvertFromUtf32(26));
Thread.Sleep(4000);
}
sno++;
}
i++;
}
这是一篇关于winforms中控件的跨线程访问主题的好文章
基本上,当您访问非UI线程的控件时,必须使用
control.Invoke
构造。错误源于您试图从另一个线程(BackgroundWorker线程)访问UIThread以获取UI控件 使用invokererequired 您必须实现一个委托 这是样品
delegate void valueDelegate(string value);
private void SetValue(string value)
{
if (InvokeRequired)
{
BeginInvoke(new valueDelegate(SetValue),value);
}
else
{
someControl.Text = value;
}
}
我只想在其他线程的UI线程中阅读listview。给出的所有解决方案都使用了
invoke
方法,但我找到了一种相当简单的方法:
ListView lvItems = new ListView(); \\in global scope
在我的代码中所需的位置:
foreach (ListViewItem item in bufferedListView1.Items)
{
lvItems.Items.Add((ListViewItem)item.Clone()); // Copied the bufferedListview's items that are to be accessed in other thread to another listview- listItems
}
然后使用my
DoWork
事件处理程序中的lvItems
listview。简单n简单:)这是否意味着如果我使用Somecontrol.Invoke()和类似于您显示的内容,我可以直接访问DoWork中的bufferedListView项?这是否意味着如果我使用Somecontrol.Invoke()和@Hassan显示的内容,我可以直接访问DoWork中的bufferedListView项?这就是我尝试的。这对我来说正确吗<代码>委托ListView项目委托(ListView bufferedListView1);私有ListView getItems(ListView bufferedListView1){if(bufferedListView1.InvokeRequested){BeginInvoke(new itemDelegate(getItems));}else{return bufferedListView1;}}