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:
Mostrar la cita
respuesta
Mostrar la cita
imprescindible
Mostrar la cita
se
Mostrar la cita
transparente
Mostrar la cita
(el
Mostrar la cita
subproceso
Mostrar la cita
más
Mostrar la cita
ejecución
Mostrar la cita
de
Mostrar la cita
#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."

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

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


Mostrar la cita
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.

Mostrar la cita
se
Mostrar la cita
Deberia de.

Mostrar la cita
transparente
Mostrar la cita
No. Puedes llamar a metodos OneWay asincronizada o no.

Mostrar la cita
(el
Mostrar la cita
Siempre puedes crear un nuevo hilo, y mejor, usar un ThreadPool y ponerlo
como un workitem.

Mostrar la cita
Has usado Google / Google Groups?

Mostrar la cita
subproceso
Mostrar la cita
más
Mostrar la cita
ejecución
Mostrar la cita
de
Mostrar la cita
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
#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.
#4 Michael Giagnocavo [MVP]
18/11/2003 - 21:50 | Informe spam
Mostrar la cita
ponerlo
Mostrar la cita
El ThreadPool lo hace mas facil, porque maneja el cleanup. Tambien, usando
el threadpool, normalmente tendras mas rendimiento con menos codigo.

Mostrar la cita
threads
Mostrar la cita
manear
Mostrar la cita
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
#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
Ads by Google
Search Busqueda sugerida