Problema con Visual Studio 2005 Express

18/01/2006 - 13:26 por Kapsule | Informe spam
Hola a todos.

No se si alguien ha probado el nuevo entorno de Visual C# Express, la verdad
es que esta muy bien en cuanto a funcionalidad para el desarrollador.

Bueno el tema es que estoy realizando una aplicacion en la cual utilizo un
thread y cuando llamo a este thread, al entrar en el llamo a un control LABEL
para actualizar un mensaje de estado. Bien cuando llega a ese punto me
muestra una excepción la cual no entiendo.

No se si alguien me puede ayudar?, gracias.

Este es el ejemplo:

public Form1()
{
InitializeComponent();

this.lbUsr.Text = "Inicio...";

lpth = new Thread(new ThreadStart(RestoreUsr));
lpth.Start();
}

private void RestoreUsr()
{
try
{
CInterBase lpDb = new CInterBase();
lpDb.SetConnect("Demo", "usr", "psw");

this.lbUsr.Text = "Conexión Ok.";

if (lpDb.get_Connection.State ==
System.Data.ConnectionState.Open)
{
OdbcCommand lpCmd = lpDb.get_Connection.CreateCommand();
lpCmd.CommandText = "UPDATE TABLE";
lpCmd.ExecuteNonQuery();
}

}
catch (Exception exc)
{
System.Windows.Forms.MessageBox.Show("ERROR->" + exc.Message);
}
finally
{
lpth = null;
Application.Exit();
}

{System.InvalidOperationException: Cross-thread operation not valid: Control
'lbUsr' accessed from a thread other than the thread it was created on.
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.Control.set_WindowText(String value)
at System.Windows.Forms.Control.set_Text(String value)
at System.Windows.Forms.Label.set_Text(String value)
at ResotoreUsrEpk.Form1.RestoreUsr() in C:\Programacion\C#\Proyectos
Mabyc\ResotoreUsrEpk\ResotoreUsrEpk\Form1.cs:line 32}
 

Leer las respuestas

#1 Octavio Hernandez
18/01/2006 - 13:53 | Informe spam
Kapsule,

El mensaje es claro, indica que no se puede acceder a un control visual
desde un hilo diferente al que lo creó. Esta es una limitación típica de
muchas librerías de controles visuales, que violan la re-entrancia del
código (que permitiría acceder a esos controles desde cualquier hilo) para
mejorar el rendimiento.

Para poder hacer lo que quieres debes utilizar el método Invoke() que tienen
todos los controles. Mira este ejemplo:

http://msdn.microsoft.com/library/d...dedapp.asp

Resumiendo, en vez de hacer:

this.lbUsr.Text = "Conexión Ok.";

debes hacer:

this.lbUsr.Invoke(new EventHandler(ActualizarEtiqueta));

y poner lo que quieres hacer dentro de un método:

public void ActualizarEtiqueta(object sender, EventArgs e)
{
this.lbUsr.Text = "Conexión Ok.";
this.lbUsr.Update();
}

Salu2 - Octavio

"Kapsule" escribió en el mensaje
news:
Hola a todos.

No se si alguien ha probado el nuevo entorno de Visual C# Express, la
verdad
es que esta muy bien en cuanto a funcionalidad para el desarrollador.

Bueno el tema es que estoy realizando una aplicacion en la cual utilizo un
thread y cuando llamo a este thread, al entrar en el llamo a un control
LABEL
para actualizar un mensaje de estado. Bien cuando llega a ese punto me
muestra una excepción la cual no entiendo.

No se si alguien me puede ayudar?, gracias.

Este es el ejemplo:

public Form1()
{
InitializeComponent();

this.lbUsr.Text = "Inicio...";

lpth = new Thread(new ThreadStart(RestoreUsr));
lpth.Start();
}

private void RestoreUsr()
{
try
{
CInterBase lpDb = new CInterBase();
lpDb.SetConnect("Demo", "usr", "psw");

this.lbUsr.Text = "Conexión Ok.";

if (lpDb.get_Connection.State => System.Data.ConnectionState.Open)
{
OdbcCommand lpCmd =
lpDb.get_Connection.CreateCommand();
lpCmd.CommandText = "UPDATE TABLE";
lpCmd.ExecuteNonQuery();
}

}
catch (Exception exc)
{
System.Windows.Forms.MessageBox.Show("ERROR->" +
exc.Message);
}
finally
{
lpth = null;
Application.Exit();
}

{System.InvalidOperationException: Cross-thread operation not valid:
Control
'lbUsr' accessed from a thread other than the thread it was created on.
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.Control.set_WindowText(String value)
at System.Windows.Forms.Control.set_Text(String value)
at System.Windows.Forms.Label.set_Text(String value)
at ResotoreUsrEpk.Form1.RestoreUsr() in C:\Programacion\C#\Proyectos
Mabyc\ResotoreUsrEpk\ResotoreUsrEpk\Form1.cs:line 32}

Preguntas similares