c# - subproceso - Actualizar etiqueta desde otro hilo
invokerequired vb net (3)
Esta pregunta ya tiene una respuesta aquí:
Yo uso un hilo escrito en otra clase para actualizar una etiqueta. La etiqueta es contenido en la clase principal de Winform.
Scanner scanner = new Scanner(ref lblCont);
scanner.ListaFile = this.listFiles;
Thread trd = new Thread(new ThreadStart(scanner.automaticScanner));
trd.IsBackground = true;
trd.Start();
while (!trd.IsAlive) ;
trd.Join();
Como puedes ver, paso la referencia de la etiqueta al constructor de la segunda clase. En la segunda clase (Escáner) tengo un método llamado "automaticScanner" que debería actualizar la etiqueta con este código:
public Scanner(ref ToolStripStatusLabel _lblContatore)
{
lblCounter= _lblContatore;
}
Thread threadUpdateCounter = new Thread(new ThreadStart(this.UpdateCounter));
threadUpdateCounter.IsBackground = true;
threadUpdateCounter.Start();
while (!threadUpdateCounter .IsAlive) ;
threadUpdateCounter.Join();
private void AggiornaContatore()
{
this.lblCounter.Text = this.index.ToString();
}
He recibido este error en la actualización de la etiqueta:
Operación de subprocesos no válida: control ''Principal'' al que se accede desde un subproceso que no sea el que se creó en
Yo uso .net 4 con Winform C #.
Muchas gracias por las respuestas.
Noticias: El problema es esta línea:
trd.Join();
Esta línea bloquea mi GUI y la etiqueta no se actualiza. ¿Existen métodos para controlar el final del hilo y actualizar la etiqueta hasta el final? Gracias
No puede actualizar la interfaz de usuario desde cualquier otro subproceso que no sea el subproceso de la interfaz de usuario. Use esto para actualizar el hilo en el hilo de la interfaz de usuario.
private void AggiornaContatore()
{
if(this.lblCounter.InvokeRequired)
{
this.lblCounter.BeginInvoke((MethodInvoker) delegate() {this.lblCounter.Text = this.index.ToString(); ;});
}
else
{
this.lblCounter.Text = this.index.ToString(); ;
}
}
Revise este capítulo y más de este libro para obtener una imagen clara acerca de los hilos:
http://www.albahari.com/threading/part2.aspx#_Rich_Client_Applications
Simplemente use el Método Control.Invoke o el Método Control.BeginInvoke .
Gran ejemplo: cómo: realizar llamadas seguras para subprocesos a los controles de formularios de Windows .
Use MethodInvoker para actualizar el texto de la etiqueta en otro hilo.
private void AggiornaContatore()
{
MethodInvoker inv = delegate
{
this.lblCounter.Text = this.index.ToString();
}
this.Invoke(inv);
}
Recibes el error porque el subproceso de la interfaz de usuario mantiene la etiqueta y, como intentas actualizarla a través de otro subproceso, obtienes una excepción de subproceso.
También puede ver: Subprocesos en formularios Windows Forms