2009-10-06 8 views
12

Possible Duplicate:
Cross-thread operation not valid: Control accessed from a thread other than the thread it was created onConseguir operación de la Cruz-hilo no válida

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 aplicación de Windows utilizando el código de arriba y me encontré con el error:

Cross-thread operation not valid.

Cómo resuelve esto ?

+2

incluso una búsqueda en "hilo cruzado" en SO da muchos resultados ... – Stormenet

Respuesta

25

Sólo se pueden realizar cambios en los controles de WinForm desde el hilo principal. Debe verificar si InvokeRequired es verdadero en el control y luego invocar el método según sea necesario.

Puede hacer algo como esto para hacer que funcione:

public void CheckUnusedTabs(string strTabToRemove) 
{ 
    if (TaskBarRef.tabControl1.InvokeRequired) 
    { 
     TaskBarRef.tabControl1.Invoke(new Action<string>(CheckUnusedTabs), strTabToRemove); 
     return; 
    }  

    TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove]; 
    tp.Controls.Remove(this); 
    TaskBarRef.tabControl1.TabPages.Remove(tp); 
} 
+0

FYI, su actualización clara del código original fue la única forma en que pude descubrir cómo implementar esto correctamente en el mío. Gracias. – Jason

+0

¡Funcionó, genial! –

5

Al usar subprocesos y controles de UI, en winforms, necesita 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); 
      } 
     } 
+0

@astande r, ¿puedes decirme cómo? – Anuya

+0

@astander intenté agregar ... if (TaskBarRef.tabControl1.incokerequired) – Anuya

+0

verifique la respuesta, agregó un ejemplo. –

19

llamada utilizando invocar, ya que está accediendo el hilo GUI mediante otro hilo

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

Esto funcionó para mí con un caso similar: actualización de GUI de un evento externo. –

-3

Establecer la variable siguiente:

CheckIllegalCrossThreadValidation = false 
+7

CheckIllegalCrossThreadValidation es una comprobación de seguridad para evitar que algunas versiones de Windows se bloqueen cuando intenta realizar actualizaciones de UI entre subprocesos. Es una locura apagarlo. –

Cuestiones relacionadas