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?
Envía tus Trackbacks a la siguiente dirección:
http://csharp.hijodeblog.com/2011/10/31/accediendo-de-forma-segura-a-controles-windows-forms-entre-hebras/trackback/

¡Deja tu comentario!





Disclaimer: Las imágenes mostradas en ésta página web se utilizan sólamente con propósitos ilustrativos, y son propiedad de sus respectivos autores (cuando es aplicable).
Hijo de Blog es un producto del Dr. SeROne

Los contenidos se ofrecen bajo una licencia de Creative Commons
Attribution-NonCommercial-NoDerivs 3.0 Unported

salvo que se indique lo contrario

Licencia de Creative Commons