使用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命令,它给出一个异常,如上所示。请建议其他编写方法。
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
项目。