Hacer que el funcionamiento entre hilos no sea válido

Posible duplicado:
Operación entre hilos no válida: control al que se accede desde un hilo que no sea el hilo en el que se creó

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

Estoy tratando de cerrar una pestaña en el tabcontrol de la aplicación de Windows usando el código anterior y encontré el error:

Operación de hilo cruzado no válido

¿Cómo resolver esto?

Solo puede realizar cambios en los controles de WinForm desde el hilo maestro. Debe verificar si InvokeRequired es verdadero en el control y luego invocar el método según sea necesario.

Puedes hacer algo como esto para que funcione:

 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); } 

llamar usando invocar, porque está accediendo al hilo de la GUI usando otro hilo

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

Al utilizar subprocesos y controles de UI, en winforms, debe usar InvokeRequired para realizar cambios en los controles.

EDITAR.

agregó un ejemplo.

Forma, con botón y etiqueta.

tratar

 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); } } 

La excepción no válida de subprocesos cruzados se debe a los controles de la interfaz de usuario a los que se accede desde otros subprocesos que el subproceso principal. Consulte esto http://helpprogramming.blogspot.com/2011/10/invalid-cross-thread-operation.html

Establezca la siguiente variable:

 CheckIllegalCrossThreadValidation = false