我在UI线程上有listview。我有一些操作要通过后台工作者的DoWork事件处理程序执行,因为它们很耗时。但我无法访问我的DoWork处理程序中的listview项,因为它引发了异常:Cross-thread operation not valid: Control 'bufferedListView1' accessed from a thread other than the thread it was created on.
那么如何在我的DoWork事件处理程序中访问我的缓冲列表视图。 这是在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++;
}
答案 0 :(得分:1)
答案 1 :(得分:0)
错误来自于您尝试从另一个线程(backgrounworker线程)访问UIThread以获取UI控件
使用InvokeRequired 你必须实现一个委托 这里是一个样本
delegate void valueDelegate(string value);
private void SetValue(string value)
{
if (InvokeRequired)
{
BeginInvoke(new valueDelegate(SetValue),value);
}
else
{
someControl.Text = value;
}
}
答案 2 :(得分:0)
我想要的只是在其他线程的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
}
然后在我的lvItems
事件处理程序中使用DoWork
列表视图。简单易行:)