Problemas con hilos

02/07/2004 - 18:28 por Omar del Valle | Informe spam
Hola lista,

Tengo el siguiente problema:

Tengo una aplicación Windows que accede a un WebService y que muestra en un
grid, el resultado retornado por uno de los métodos de dicho servicio.

Resulta que para no frenar el hilo de la aplicación en cada actualización,
he creado un nuevo hilo con prioridad baja que se encarga de invocar el
servicio Web y levantar un evento al finalizar, que como parámetro incluye
el nuevo DataSet traído desde el servicio.

El problema es que cuando hago lo siguiente :

Hilo principal - Evento que ocurre al terminar de traer el DataSet
...

// Asigno al datasource del grid la tabla 0 del DataSet que se me entrega
en el evento.
dgClients.DataSource = ds.Tables[0];
...

Aquí la aplicación levanta un error diciéndome que no asociar objetos
creados en otro hilo a objetos del hilo actual.

Alguna sugerencia???

Gracias y Salu2
-
Omar del Valle Rodríguez
Ciudad de la Habana - Cuba
Desarrollador Microsoft 3 Estrellas .NET
 

Leer las respuestas

#1 Omar del Valle
02/07/2004 - 22:18 | Informe spam
Bueno, me auto-respondo y asi queda aclarada la duda para el resto.

El problema es que para acceder a controles desde otro hilo, es necesario
usar métodos que sean seguro, en otras palabras, usar los métodos que expone
la interfaz ISynchronizeInvoke y que implementa la clase Control.

La forma es muy sencilla.. se crea un delegate que llama a un método en el
hilo secundario. Este delegate no puede ser invocado de forma normal sino
mediante un método que permita sincronización. Si ven la interfaz se darán
cuenta que hay varios. Yo en mi caso use el Invoke donde paso el delegate
con el datase como argumento.

les paso el ejemplo.

public delegate void OnProcessesComplete(DataSet ds);

public class Form1 : System.Windows.Forms.Form
{
public event OnProcessesComplete Completed;
...

private void Form1_Load(object sender, System.EventArgs e)
{
this.Completed += new OnProcessesComplete(clientProcess_Completed);

Thread newThread;
newThread = new Thread(new ThreadStart(Run));
newThread.Priority = System.Threading.ThreadPriority.Lowest;
newThread.IsBackground = true;
newThread.Start();
}

private void Run()
{
try
{
while (true)
{
.
DataSet ds = remoteService.GetActiveClients();

object[] arg = {ds};

this.Invoke(this.Completed, arg );
..
}
}
catch {}
}

private void clientProcess_Completed(DataSet ds)
{
dgClients.DataSource = ds.Tables[0];
}
}


Listo.. todo funciona de marabillas.

Salu2
Omar del Valle R.
Ciudad de la Habana - Cuba
Desarrollador Microsoft 3 Estrellas .NET
"Omar del Valle" wrote in message
news:
Hola lista,

Tengo el siguiente problema:

Tengo una aplicación Windows que accede a un WebService y que muestra en


un
grid, el resultado retornado por uno de los métodos de dicho servicio.

Resulta que para no frenar el hilo de la aplicación en cada actualización,
he creado un nuevo hilo con prioridad baja que se encarga de invocar el
servicio Web y levantar un evento al finalizar, que como parámetro incluye
el nuevo DataSet traído desde el servicio.

El problema es que cuando hago lo siguiente :

Hilo principal - Evento que ocurre al terminar de traer el DataSet
...

// Asigno al datasource del grid la tabla 0 del DataSet que se me


entrega
en el evento.
dgClients.DataSource = ds.Tables[0];
...

Aquí la aplicación levanta un error diciéndome que no asociar objetos
creados en otro hilo a objetos del hilo actual.

Alguna sugerencia???

Gracias y Salu2
-
Omar del Valle Rodríguez
Ciudad de la Habana - Cuba
Desarrollador Microsoft 3 Estrellas .NET


Preguntas similares