Accediendo de forma segura a controles Windows Forms entre hebras
Hemos creado una hebra, y en ella hemos escriot una línea tan sencilla como:
this.richTextBox.Text = "¡Hola, mundo!rn";
Y entonces de repente salta ésta excepción:
“Cross-thread operation not valid: Control ‘richTextBox’ accessed from a thread other than the thread it was created on.”
LA explicación es clara, hemos intentado acceder a un control desde fuera de la hebra que lo creó. Para solucionarlo usaremos una de las más interesantes características de C#: los delegados. El código de la solución sería el siguiente:
public class Formulario : Form
{
// Declaramos el delegado
delegate void SetTextCallback(string texto);
// Constructor
public Form1()
{
// Inicializamos los componentes del diseñador
InitializeComponent();
// Creamos y ejecutamos la hebra
Thread hebra = new Thread(new new ThreadStart(this.funcionHebra));
hebra.Start();
}
// Función de la hebra
public void funcionHebra()
{
this.SetTex("¡Hola, mundo!rn");
}
// Método para hacer la llamada al control entre hebras de forma segura
private void SetText(string texto)
{
if (this.richTextBox.InvokeRequired)
{
// Si viene desde la hebra invocamos al delegado con éste método
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { texto });
}
else
{
// Si no, usamos el control directamente
this.richTextBox.Text = texto;
}
}
}
Como vemos, con una función que compruebe el origen de la llamada y un delegado para acceder de forma segura a ése método, solucionaremos el problema.
¡Espero que os sea de utilidad! ¡Happy coding!
¿Te ha gustado?
¡Suscribete al feed RSS!