使用C#中的列表框进行线程处理

本文关键字:线程 处理 列表 使用 | 更新日期: 2023-09-27 18:29:22

我正在开发一个代码,其中必须读取数据表单列表框并上传一个外部文件,按下名为Start的按钮,使用此列表框我会收到如下所示的错误。

"System.InvalidOperationException"类型的未处理异常发生在System.Windows.Forms.dll 中

附加信息:跨线程操作无效:控件"listBox1"是从创建它的线程以外的线程访问的上。

我的代码如下

private void Start_Click(object sender, EventArgs e)
{
 Thread ss = new Thread(Automode);  
 ss.Start(); 
} 
 private void Automode()
    {
        ....
       for (int i = 0; i < listBox1.Items.Count; i++)
        {
            listBox1.SetSelected(i, true);
            string pattern = "[gxyzbcmij][-+]?[0-9]*''.?[0-9]*";
            string text = listBox1.Text;
            Regex gcode = new Regex(pattern, RegexOptions.IgnoreCase);
            MatchCollection code = gcode.Matches(text);
        }
        .....   
     }

在列表框中。SetSelected命令,它给出一个异常,如上所示。请建议其他编写方法。

使用C#中的列表框进行线程处理

delegate void SetSelectedCall(int index, bool option);
private void SetSelectedElement(int index, bool option)
{
  if (this.listBox1.InvokeRequired)
  { 
    SetSelectedCall d = new SetSelectedCall(SetSelectedElement);
    this.Invoke(d, new object[] { int index, bool option});
  }
  else
  {
    this.listBox1.SetSelected(index,option);
  }
}

取自跨线程操作无效:Control';text框1';从一个线程访问,而不是为这个问题创建和定制的线程。

您不能从后台线程访问listBox1

如果可能,请直接在Start_Click方法中运行函数Automode()中的代码。如果您必须在后台线程中运行代码,我可能会建议使用更像Task的方法,这样您仍然可以根据传递参数和等待响应来执行操作。然后,您仍然可以选择listBox1项目。