使跨线程操作无效

可能重复:
跨线程操作无效:从创建它的线程以外的线程访问控制

public void CheckUnusedTabs(string strTabToRemove) { TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove]; tp.Controls.Remove(this); TaskBarRef.tabControl1.TabPages.Remove(tp); } 

我试图使用上面的代码关闭Windows应用程序的tabcontrol中的选项卡,我遇到了错误:

跨线程操作无效。

怎么解决这个?

您只能从主线程更改WinForm控件。 您需要检查控件上的InvokeRequired是否为true,然后根据需要调用方法。

你可以做这样的事情来使它工作:

 public void CheckUnusedTabs(string strTabToRemove) { if (TaskBarRef.tabControl1.InvokeRequired) { TaskBarRef.tabControl1.Invoke(new Action(CheckUnusedTabs), strTabToRemove); return; } TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove]; tp.Controls.Remove(this); TaskBarRef.tabControl1.TabPages.Remove(tp); } 

使用invoke调用,因为您正在使用另一个线程访问GUI线程

  this.Invoke((MethodInvoker)delegate() {CheckUnusedTabs(""); }); 

使用线程和UI控件时,在winforms中,您需要使用InvokeRequired来更改控件。

编辑。

添加了一个例子。

表格,带按钮和标签。

尝试

 private void button2_Click(object sender, EventArgs e) { Thread thread = new Thread(UpdateProcess); thread.Start(); } private void SetLabelText(string val) { label1.Text = val; } delegate void m_SetLabel(string val); private void UpdateProcess() { int i = 0; while (true) { if (label1.InvokeRequired) { m_SetLabel setLabel = SetLabelText; Invoke(setLabel, i.ToString()); } else label1.Text = i.ToString(); i++; Thread.Sleep(500); } } 

跨线程无效exception是由于从主线程以外的其他线程访问UI控件。请参阅http://helpprogramming.blogspot.com/2011/10/invalid-cross-thread-operation.html

设置以下变量:

 CheckIllegalCrossThreadValidation = false