0

我在 UI 线程上有列表视图。我有一些操作要通过后台工作人员的 DoWork 事件处理程序执行,因为它们很耗时。但是我无法访问 DoWork 处理程序中的列表视图项,因为它引发了异常:Cross-thread operation not valid: Control 'bufferedListView1' accessed from a thread other than the thread it was created on.

那么如何在我的 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++; 
}
4

3 回答 3

1

这是一篇关于跨线程访问winforms中控件的好文章。

基本上,每当您访问不是来自 UI 线程的控件时,您都必须使用

control.Invoke

构造。

于 2012-08-18T06:08:45.853 回答
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;
       }
    }
于 2012-08-18T06:09:33.813 回答
0

我想要的只是在其他线程的 UI 线程中读取列表视图。给出的所有解决方案都是使用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简单 n 简单 :)

于 2012-08-18T11:15:09.393 回答