Programación Asíncrona

16/11/2003 - 10:05 por Mario Barro | Informe spam
Hola todos/as;

Hace unos días expuse unas cuestiones sobre este tema y no recibí respuesta
(entiendo que es un tema un tanto complejo). Me vaís a permitir que lo
vuelva a exponer a ver si hay más suerte :)

Tengo varias dunas serias dudas con respecto a la programación asíncrona y
paso a exponerlas:

PRIMERA CUESTIÓN:
En una implementación de una llamada asíncrona a un método (por parte del
cliente), qué cumple los requisitos [OneWay], es necesario e imprescindible
llamar a "EndInvoke".
Es decir, al márcar dicho método con el atributo [OneWay] no necesitamos
esperar nada, ni atrapar ninguna excepción

Ejemplo:

Clase Servidora:
Método --> public void MiMetodo( string cadena ) {}
Delegado --> public delegate void AsyncDlgt( string cadena );

Clase Cliente:
Instancia Clase Servidora --> CS
Delegado --> AsyncDlgt dlgt = new AsyncDlgt( CS.MiMetodo);
Llamada asincrona --> dlgt.BeginInvoke("Prueba", null, null)

No se proporciona "AsyncCallback", ni "objeto state", ya que, como he
comentado, no se necesita procesar devolución ni gestión de excepciones.

1.- ¿Es correcto este enfoque en este caso?. La idea es que no entorpezca
para nada un proceso intenso principal.

2.- ¿Se libera correctamente el subproceso iniciado con la llamada si no se
realiza el paso comentado?

3.- ¿El mero hecho de marcar con el atributo [OneWay] (cumpliendo los
requisitos) a un método le supone ejecución asíncrona de manera transparente
para el llamante (como parece que pasa con la llamada a un método de un
objeto remoto)?

3. - Valdría también para la generación de un evento de forma asíncrona (el
método manejador con el atributo [OneWay]).
¿Qué mecanismo existen (o cómo se puede realizar) un lanzamiento de evento
asíncrono, es decir, lanzarlo pero sin tener que esperar a que se procese
para seguir la ejecución.


SEGUNDA CUESTION:
He intentado dar soporte asíncrono a un método de una clase sencilla, pero
no acabo de encontrar un ejemplo sencillo de clase servidora con métodos
asíncronos y ejemplo de cómo llamarlos desde un cliente
Agradecería enormente unos sencillos ejemplos, ya que no los encuentro.


TERCERA CUESTIÓN Y ÚLTIMA.
Tengo dudas a nivel conceptual con los subprocesos y escalabilidad de las
aplicaciones que utilizan la arquitectura asíncrona. Y me explico:
Cuando se realiza una llamada a un método asíncrono se libera el subproceso
llamante y se genera uno nuevo del grupo de procesos de sistema
"ThreadinPool".
Según tengo entendido este Pooll maneja como máximo 25 subprocesos.
¿Quiere decir esto que no se podría estar atendiendo de manera asíncrona más
de 25 peticiones?
¿Cómo escalaría este enfoque asíncrono del de generar una hebra de ejecución
por cada subproceso?
Digamos para un servicio que debe atender a cientos o miles de peticiones de
manera intensiva.


Pido disculpas por la extensión del mensaje, y espero me podáis ayudar a
aclararme con mis incipientes dudas.

Saludos:
Mario Barro.

Preguntas similare

Leer las respuestas

#1 Néstor Marcel Sánchez Ahumada
16/11/2003 - 22:14 | Informe spam
Hola Mario,
también soy principiante en esto de C# con multitarea y también tengo las
dudas que tu, pero al parecerer ninguno del foro sabemos tanto como para
responder. Creo que sería mejor preguntar en el foro en inglés.
Saludos,

Néstor.

"Mario Barro" wrote in message
news:
Hola todos/as;

Hace unos días expuse unas cuestiones sobre este tema y no recibí


respuesta
(entiendo que es un tema un tanto complejo). Me vaís a permitir que lo
vuelva a exponer a ver si hay más suerte :)

Tengo varias dunas serias dudas con respecto a la programación asíncrona y
paso a exponerlas:

PRIMERA CUESTIÓN:
En una implementación de una llamada asíncrona a un método (por parte del
cliente), qué cumple los requisitos [OneWay], es necesario e


imprescindible
llamar a "EndInvoke".
Es decir, al márcar dicho método con el atributo [OneWay] no necesitamos
esperar nada, ni atrapar ninguna excepción

Ejemplo:

Clase Servidora:
Método --> public void MiMetodo( string cadena ) {}
Delegado --> public delegate void AsyncDlgt( string cadena );

Clase Cliente:
Instancia Clase Servidora --> CS
Delegado --> AsyncDlgt dlgt = new AsyncDlgt( CS.MiMetodo);
Llamada asincrona --> dlgt.BeginInvoke("Prueba", null, null)

No se proporciona "AsyncCallback", ni "objeto state", ya que, como he
comentado, no se necesita procesar devolución ni gestión de excepciones.

1.- ¿Es correcto este enfoque en este caso?. La idea es que no entorpezca
para nada un proceso intenso principal.

2.- ¿Se libera correctamente el subproceso iniciado con la llamada si no


se
realiza el paso comentado?

3.- ¿El mero hecho de marcar con el atributo [OneWay] (cumpliendo los
requisitos) a un método le supone ejecución asíncrona de manera


transparente
para el llamante (como parece que pasa con la llamada a un método de un
objeto remoto)?

3. - Valdría también para la generación de un evento de forma asíncrona


(el
método manejador con el atributo [OneWay]).
¿Qué mecanismo existen (o cómo se puede realizar) un lanzamiento de evento
asíncrono, es decir, lanzarlo pero sin tener que esperar a que se procese
para seguir la ejecución.


SEGUNDA CUESTION:
He intentado dar soporte asíncrono a un método de una clase sencilla, pero
no acabo de encontrar un ejemplo sencillo de clase servidora con métodos
asíncronos y ejemplo de cómo llamarlos desde un cliente
Agradecería enormente unos sencillos ejemplos, ya que no los encuentro.


TERCERA CUESTIÓN Y ÚLTIMA.
Tengo dudas a nivel conceptual con los subprocesos y escalabilidad de las
aplicaciones que utilizan la arquitectura asíncrona. Y me explico:
Cuando se realiza una llamada a un método asíncrono se libera el


subproceso
llamante y se genera uno nuevo del grupo de procesos de sistema
"ThreadinPool".
Según tengo entendido este Pooll maneja como máximo 25 subprocesos.
¿Quiere decir esto que no se podría estar atendiendo de manera asíncrona


más
de 25 peticiones?
¿Cómo escalaría este enfoque asíncrono del de generar una hebra de


ejecución
por cada subproceso?
Digamos para un servicio que debe atender a cientos o miles de peticiones


de
manera intensiva.


Pido disculpas por la extensión del mensaje, y espero me podáis ayudar a
aclararme con mis incipientes dudas.

Saludos:
Mario Barro.









Respuesta Responder a este mensaje
#2 Michael Giagnocavo [MVP]
17/11/2003 - 17:58 | Informe spam
"When one-way methods are invoked, no reply message or status or information
is expected. The OneWayAttribute is used to indicate that the method has a
void return and only in parameters. The method is cannot throw any
exceptions, and ref parameters and return values are not supported. The
method can execute synchronously or asynchronously with respect to the
caller. The caller cannot make assumptions that the one-way call has
executed on the server object when thread control returns."

PRIMERA CUESTIÓN:
En una implementación de una llamada asíncrona a un método (por parte del
cliente), qué cumple los requisitos [OneWay], es necesario e


imprescindible
llamar a "EndInvoke".
Es decir, al márcar dicho método con el atributo [OneWay] no necesitamos
esperar nada, ni atrapar ninguna excepción



Debes revisar este thread:
http://groups.google.com/groups?hl=...oke%2Bvoid

Que habla sobre llamar EndInvoke *siempre* (debido a un bug: memory leak).


Clase Servidora:
Método --> public void MiMetodo( string cadena ) {}
Delegado --> public delegate void AsyncDlgt( string cadena );

Clase Cliente:
Instancia Clase Servidora --> CS
Delegado --> AsyncDlgt dlgt = new AsyncDlgt( CS.MiMetodo);
Llamada asincrona --> dlgt.BeginInvoke("Prueba", null, null)

No se proporciona "AsyncCallback", ni "objeto state", ya que, como he
comentado, no se necesita procesar devolución ni gestión de excepciones.

1.- ¿Es correcto este enfoque en este caso?. La idea es que no entorpezca
para nada un proceso intenso principal.



OneWay significa que el metodo no DEBE dar excepciones ni nada. Pero, como
mencione arriba, debes llamar a EndInvoke de todas formas, aun si no
necesitas el valor de resultado.

2.- ¿Se libera correctamente el subproceso iniciado con la llamada si no


se
realiza el paso comentado?



Deberia de.

3.- ¿El mero hecho de marcar con el atributo [OneWay] (cumpliendo los
requisitos) a un método le supone ejecución asíncrona de manera


transparente
para el llamante (como parece que pasa con la llamada a un método de un
objeto remoto)?



No. Puedes llamar a metodos OneWay asincronizada o no.

3. - Valdría también para la generación de un evento de forma asíncrona


(el
método manejador con el atributo [OneWay]).
¿Qué mecanismo existen (o cómo se puede realizar) un lanzamiento de evento
asíncrono, es decir, lanzarlo pero sin tener que esperar a que se procese
para seguir la ejecución.



Siempre puedes crear un nuevo hilo, y mejor, usar un ThreadPool y ponerlo
como un workitem.

SEGUNDA CUESTION:
He intentado dar soporte asíncrono a un método de una clase sencilla, pero
no acabo de encontrar un ejemplo sencillo de clase servidora con métodos
asíncronos y ejemplo de cómo llamarlos desde un cliente
Agradecería enormente unos sencillos ejemplos, ya que no los encuentro.



Has usado Google / Google Groups?

TERCERA CUESTIÓN Y ÚLTIMA.
Tengo dudas a nivel conceptual con los subprocesos y escalabilidad de las
aplicaciones que utilizan la arquitectura asíncrona. Y me explico:
Cuando se realiza una llamada a un método asíncrono se libera el


subproceso
llamante y se genera uno nuevo del grupo de procesos de sistema
"ThreadinPool".
Según tengo entendido este Pooll maneja como máximo 25 subprocesos.
¿Quiere decir esto que no se podría estar atendiendo de manera asíncrona


más
de 25 peticiones?
¿Cómo escalaría este enfoque asíncrono del de generar una hebra de


ejecución
por cada subproceso?
Digamos para un servicio que debe atender a cientos o miles de peticiones


de
manera intensiva.



25 por procesador es por default, porque eso normalmente da el mejor
rendimiento. Siempre puedes manejar tu propios threads, creando threads
como necesitas. Pero aun ASP.NET solo usa 25 threads por procesador, y es
capaz de manejar muchos peticiones.

-mike
MVP
Respuesta Responder a este mensaje
#3 Mario Barro
18/11/2003 - 08:36 | Informe spam
Gracias por tu ayuda y colaboración.

Alguna de mis dudas se han despejado, sobre todo respecto al tema
"EndInvoke".

Ahora bien, tengo alguna más, que si me permitís las expondré;

1) Cuando dices;

|> Siempre puedes crear un nuevo hilo, y mejor, usar un ThreadPool y ponerlo
|> como un workitem.

Qué ventaja aportaría este enfoque respecto de utilizar una hebra
directamente ?

2) En cuanto a la búsqueda de un ejemplo de clase que implemente métodos
asíncronos he mirado en google y no he encontrado un buen ejemplo claro.
Si alguno lo encuentra o lo sabe agradecería lo comentase. Yo por mi
parte haré lo mismo.

3) Comentas;

|> 25 por procesador es por default, porque eso normalmente da el mejor
|> rendimiento. Siempre puedes manejar tu propios threads, creando threads
|> como necesitas. Pero aun ASP.NET solo usa 25 threads por procesador, y
es
|> capaz de manejar muchos peticiones.

Dónde está la frontera entre un enfoque y otro, es decir, qué parámetros
están involucrados para tomar una decisión al respecto.
(número estimado de hilos concurrentes, carga de proceso de los mismos,
tiempo de uso, etc)

Dices que ASP.NET sólo maneja 25 threads por procesador y es capaz de manear
muchas peticiones
¿De cuánto estamos hablando en términos generales?

De nuevo pido disculpas por la extensión y espero este tema ayude a más
personas que estén con este tipo de dudas.

Gracias y saludos.
Mario Barro.
Respuesta Responder a este mensaje
#4 Michael Giagnocavo [MVP]
18/11/2003 - 21:50 | Informe spam
1) Cuando dices;

|> Siempre puedes crear un nuevo hilo, y mejor, usar un ThreadPool y


ponerlo
|> como un workitem.

Qué ventaja aportaría este enfoque respecto de utilizar una hebra
directamente ?



El ThreadPool lo hace mas facil, porque maneja el cleanup. Tambien, usando
el threadpool, normalmente tendras mas rendimiento con menos codigo.

3) Comentas;

|> 25 por procesador es por default, porque eso normalmente da el mejor
|> rendimiento. Siempre puedes manejar tu propios threads, creando


threads
|> como necesitas. Pero aun ASP.NET solo usa 25 threads por procesador, y
es
|> capaz de manejar muchos peticiones.

Dónde está la frontera entre un enfoque y otro, es decir, qué parámetros
están involucrados para tomar una decisión al respecto.
(número estimado de hilos concurrentes, carga de proceso de los mismos,
tiempo de uso, etc)

Dices que ASP.NET sólo maneja 25 threads por procesador y es capaz de


manear
muchas peticiones
¿De cuánto estamos hablando en términos generales?



Bueno, Microsoft.com usa ASP.NET, y es el tercer sitio mas grande en el
mundo :).

Todo depende de cuanto tiempo de CPU el thread toma para hacer su trabajo.
25 es un numero elegido porque es una buena limite. Recordate que pueden
llegar 1000 peticiones, y das servicio a 25 a la vez. Tambien, cada vez que
el CPU cambia a otro thread, hay un context switch, y eso tiene problemas de
tendimiento con muchos threads.

Normalmente, solo haras un threadpool mas grande (o hacer tus propios
threadpool) si las funciones son algo que no usan el CPU, por ejemplo, un
escaneo de red (donde tu thread queda unos segundos esperando por una
respuesta de red). En esos casos, mas threads pueden ayudar, hasta el punto
que un recurso esta 100% utilizado. En un webserver, esto casi siempre es
el CPU. Tu aplicacion puede ser distinto.

-mike
MVP
Respuesta Responder a este mensaje
#5 Mario Barro
19/11/2003 - 10:06 | Informe spam
Antetodo gracias por tus aclaraciones y ayuda incondicional .

He investidado el tema del ThreadPool y creo que se acoplará perfectamente a
la arquitectura del desarrollo.


Saludos y hasta otra ocasión.
Mario Barro
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida