2010-01-31 21 views
10

Necesito ayuda para establecer/cambiar el valor de una etiqueta en mi programa C# cada vez que lo intento se produce un error diciendo que necesito cruzarlo. ¿Alguien puede escribir algún código para ayudarme con eso? Mi código es:Establecer el valor de la etiqueta con C# Cross Threading

int number = 0; 
int repeats = Convert.ToInt32(textBox2.Text); 

while (number < repeats) 
{ 
    repeats++; 
    label5.Text = "Requested" + repeats + "Times"; 
} 

¿Puede alguien ayudarme? Gracias.

+0

Supongo que quiere decir que le están lanzando una excepción porque intenta establecer la propiedad Texto de la etiqueta desde otra secuencia. – zebrabox

+0

Sí :(Está bastante ordenado ahora. – Lawrence

Respuesta

30

intente lo siguiente para actualizar el valor

label5.Invoke((MethodInvoker)(() => label5.Text = "Requested" + repeats + "Times")); 

El método Invoke (de Control.Invoke) hará que el pasado en delegado a ejecutar en el hilo que lo dado Control se affinitize a. En este caso, hará que se ejecute en el hilo de la GUI de su aplicación y, por lo tanto, hará que la actualización sea segura.

+0

Muchas gracias :) ¡Trabajé una delicia! – Lawrence

9

Puede agregar este método de extensión que utilizo regularmente (similar en la técnica a la respuesta de @ JaredPar):

/// <summary> 
    /// Extension method that allows for automatic anonymous method invocation. 
    /// </summary> 
    public static void Invoke(this Control c, MethodInvoker mi) 
    { 
    c.Invoke(mi); 

    return; 
    } 

entonces usted puede utilizar en cualquier control (o derivados) de forma nativa en su código a través de:

// "this" is any control (commonly the form itself in my apps) 
this.Invoke(() => label.Text = "Some Text"); 

también puede ejecutar múltiples métodos con los métodos que pasa en el anonimato:

this.Invoke 
(
    () => 
    { 
     // all processed in a single call to the UI thread 
     label.Text = "Some Text"; 
     progressBar.Value = 5; 
    } 
); 

Tenga en cuenta que si sus hilos intentan Invocar en un control que está dispuesto, obtendrá una excepción ObjectExposedException. Esto sucede si un hilo aún no abortado por la aplicación se está cerrando. Puede "comer" la ObjectDisposedException rodeando su llamada a Invoke(), o puede "comer" la excepción en la extensión del método Invoke().