2011-09-30 29 views
8

Estoy practicando el enhebrado y encontré este problema. La situación es la siguiente:Accediendo al control de un formulario desde un hilo separado

  1. tengo 4 barras de progreso en una sola forma, una para la descarga de un archivo, una para mostrar el estado de carga de la página, etc ...

  2. tengo que controlar el progreso de cada ProgressBar desde un hilo separado.

El problema es que estoy recibiendo una InvalidOperationException que dice

operación de la Cruz-hilo no válido: Control 'progressBar1' se accede desde un hilo que no sea el hilo que se creó el .

¿Estoy equivocado en este enfoque o alguien me puede decir cómo implementar esto?

+1

Consulte [este] (http://www.yoda.arachsys.com/csharp/threads/winforms.shtml) artículo de Jon Skeet sobre cómo enhebrar en Windows Forms. Debería aclarar las cosas. La breve explicación sería que debe invocar los elementos de la interfaz de usuario de sus otros hilos, ya que la interfaz de usuario se ejecuta en su propio hilo. – alex

Respuesta

2

Debe invocar el método Invocar desde subprocesos que no sean UI para realizar algunas acciones en el formulario y otros controles.

+0

No soy un programador avanzado. ¿Puedes por favor consejos sobre cómo hacemos eso? Gracias –

+0

@ Chandu-Indyaah - Si no eres un programador avanzado, entonces debes utilizar BackgroundWorker. –

9

Puede marcar la bandera Control.InvokeRequired y luego usar el método Control.Invoke si es necesario. Control.Invoke toma un delegado para que pueda usar la acción incorporada <T>.

public void UpdateProgress(int percentComplete) 
{ 
    if (!InvokeRequired) 
    { 
     ProgressBar.Value = percentComplete; 
    } 
    else 
    { 
     Invoke(new Action<int>(UpdateProgress), percentComplete); 
    } 
} 
30

A Control sólo se puede acceder dentro de la rosca que lo creó - el hilo de interfaz de usuario.

Usted tendría que hacer algo como:

Invoke(new Action(() => 
{ 
    progressBar1.Value = newValue; 
})); 

El método de invocación a continuación, ejecuta el delegado dado, en el hilo de interfaz de usuario.

+2

+1 para usar las funciones de Lambda. – alex

5
private void Form1_Load(object sender, EventArgs e) 
    { 
     CheckForIllegalCrossThreadCalls = false; 
    } 

Quizás esto funcione.

+0

No aprobará de esta manera, pero funciona :-) – Swanand

Cuestiones relacionadas