Thread y delegate

16/09/2005 - 17:44 por Nux | Informe spam
Buenas !, necesito que alguien me oriente.


Necesito saber, o que alguien me explique como funcionan los delegados.



yo en estos momentos estoy ejecutando varios thread al mismo tiempo



for(int i=1; i<=Total;i++)

{

Thread oThread = new Thread(new ThreadStart(StartMethod));

oThread.Start();

}




public static void StartMethod(int Valor)

{

int Status;

Status=Valor;

Calls Llamada=new Calls();

Llamada.GenerateLlamada(typecall);

}


El tema es que le tengo que pasar al metodo StartMethod un parametro
(Valor), estuve leyendo y aparentemente tengo que crear un delegado del
metodo, pero la verdad es que no se como. Si alguien me puede dar una mano
desde ya muchas gracias



Saludos

Preguntas similare

Leer las respuestas

#1 A.Poblacion
16/09/2005 - 20:25 | Informe spam
"Nux" wrote in message
news:%
Buenas !, necesito que alguien me oriente.
[...]
Thread oThread = new Thread(new ThreadStart(StartMethod));
[...]
public static void StartMethod(int Valor)
[...]
El tema es que le tengo que pasar al metodo StartMethod un parametro
(Valor), estuve leyendo y aparentemente tengo que crear un delegado del
metodo, pero la verdad es que no se como.



*YA* estás creando un delegado: la instrucción que has metido, "new
ThreadStart(StartMethod)", lo que hace es crear un delegado del tipo
TreadStart, e inicializarlo apuntando a tu método.
Por desgracia, de esta manera no puedes pasar un parámetro a tu método:
El constructor del la clase Thread, al que llamas al hacer el "new Thread",
requiere obligatoriamente un delegado del tipo "ThreadStart", y no puede ser
ningún otro tipo de delegado. Y el tipo ThreadStart está definido como
"delegado que sirve para apuntar a subrutinas que no reciben ningún
parámetro".

Para arrancar un thread pasándole un parámetro se recurre al siguiente
truco: Tienes que crear una rutina que no reciba ningún parámetro y meterla
dentro de una clase. En la clase metes una variable de instancia, que
inicializas con el parámetro que quieras al instanciar la clase. Y al
delegado que usas para arrancar el thread le pasas la función sin parámetros
que tienes dentro de la instancia de tu clase. Y la función sin parámetros,
cuando necesite el parámetro, lo lee de la variable de instancia de la
clase.
Respuesta Responder a este mensaje
#2 Pablo M
16/09/2005 - 22:44 | Informe spam
A.Poblacion:
[...]
Para arrancar un thread pasándole un parámetro se recurre al siguiente
truco: Tienes que crear una rutina que no reciba ningún parámetro y meterla
dentro de una clase. En la clase metes una variable de instancia, que
inicializas con el parámetro que quieras al instanciar la clase. Y al
delegado que usas para arrancar el thread le pasas la función sin
parámetros
que tienes dentro de la instancia de tu clase. Y la función sin parámetros,
cuando necesite el parámetro, lo lee de la variable de instancia de la
clase.
[...]

He visto esa soluciónen otros códigos, y es válida, aunque .NET ofrece algo
más recomendable para mantener los patrones de nuestra aplicación intactos y
no crear clases con la única idea de que alberguen un método.

[...]


Necesito saber, o que alguien me explique como funcionan los delegados.





[...]



Piensa que los delegados son (algo así como) tipos definidos por el
usuario,pero en lugar de definir variables, definen funciones. Cuando
capturas un button.click estas creando una instancia de un delegado definido
como

delegClick(Object, EventArgs);



Bueno, me he saltado lo que son los eventos, pero te dejo a ti investigar un
poco, ya que para acceder al pool de threads no te hace falta.



[...]

Thread oThread = new Thread(new ThreadStart(StartMethod));



oThread.Start();



[...]



La forma más cómoda de llamar a un thread pasándole un parametro (chapuzas
de variables globales aparte) es usando llamadas asíncronas:



1) te defines un delegado con la firma de la función que vas a usar



public delegate int DelegSuma(int A,int B);



2) creas la función que quieres llamar desde los threads



public int Suma(int A, int B)

{

return A + B;

}



3) al finalizar el thread, si la función devolvía un valor necesitamos
procesarlo desde algún otro lugar. Para ello .NET dispone de un delegado
(AsyncCallback) que nos indica como recoger el resultado.Creamos por lo
tanto la función de recogida. El parametro AsyncResult nos da acceso a la
función que se ha ejecutado:



// espacio de nombres para AsyncResult

using System.Runtime.Remoting.Messaging;



public void Resultado(IAsyncResult r)

{



AsyncResult ar = (AsyncResult)r;

int suma = ((DelegSuma)ar.AsyncDelegate).EndInvoke(r);

System.Diagnostics.Debug.Write(ar.AsyncState);

System.Diagnostics.Debug.Write(suma);

}



4) Realizamos la llamada asíncrona. En el ejemplo que he hecho te pongo dos
llamadas. Al obtener el resultado, una forma de distinguir de que función
viene es mediante el AsyncState, que en este caso lo pongo a "Suma 1" y
"Suma 2".



{

DelegSuma add = new DelegSuma(Suma);

add.BeginInvoke(3, 5, Resultado, "primera suma");

add.BeginInvoke(9, 23, Resultado, "segunda suma");

}





Los threads salen del threadpool. Este pool puede ser accedido directamente
en lugar de usar la llamada asíncrona, pero creo que de la manera que te he
puesto el asunto es menos complicado.





Un saludo a todos





PD: estoy en un cambio de proyecto y tengo tiempo para escribir, se nota ...
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida