.net - sincrona - Asincrónica y aclaración de métodos asincrónicos?
herramientas asincronicas (2)
AFAIK - (y he leído mucho al respecto), existen métodos asíncronos (¡ no delegados asíncronos!) Para resolver el problema del "hilo está bloqueado" cuando se trata de operaciones de E / S como: leer un archivo o descargar un archivo:
Richter lo muestra muy claramente aquí:
-
Task<T>
no está relacionada con el problema de bloqueo de E / S. simplemente es como abrir un hilo ( más eficiencia extra + funcionalidad ), pero aún hace que un hilo consuma cantidades de CPU, etc.
Y aquí está mi pregunta:
He leído (msdn) que:
Un método asíncrono proporciona una forma conveniente de realizar trabajos potencialmente de larga duración sin bloquear el hilo de la persona que llama . La persona que llama de un método asíncrono puede reanudar su trabajo sin esperar a que el método asíncrono termine.
¿Es simplemente como crear una
Task<t>
conContinueWith
?¿La terminología no es confusa?
asynchronous methods
son para operaciones dei/o
(donde hay cero subprocesos en espera mientras se realiza la operación de E / S y no hay ningún hilo tratando con ella). Pero llamar a un código (que usa async) como:asynchronous methods
es un poco confuso. ¿no crees? porque supongo que hay otro hilo que se está ejecutando ... (que es mi primera pregunta en realidad).
¿De dónde es la confusión?
Porque Albahari tiende a enfatizar para qué son los métodos asincrónicos:
ps He leído algunas preguntas aquí en SO con respecto a este tema, pero no encontré ninguna que se refiera a la clasificación errónea de que los métodos asíncronos están aquí para hacer frente a las operaciones de io.
Task<T>
no está relacionada con el problema de bloqueo de E / S. Simplemente es como abrir un hilo (más eficiencia y funcionalidad extra), pero aún provoca que un hilo consuma cuantos de CPU, etc.
No necesariamente. Básicamente, existen dos tipos de Task
: una ejecuta una pieza de código sincrónica y finaliza cuando el código termina de ejecutarse. Este tipo de Task
bloquea un Thread
todo el tiempo, ya que comienza a ejecutarse hasta que se completa (con éxito o no).
Pero hay otro tipo de Task
: una que se completa cuando sucede algo. Este tipo de Task
es lo que .Net 4.5 y C # 5.0 usan mucho y no bloquea un Thread
(al menos no directamente). Puede crear dicha Task
usted mismo utilizando TaskCompletionSource<T>
.
(Otro punto es que un hilo bloqueado no consume ninguna CPU, pero eso no es realmente relevante aquí).
¿Es simplemente como crear una
Task<t>
conContinueWith
?
Sí, await t
es bastante similar a t.ContinueWith(rest of the method)
.
¿La terminología no es confusa? Los métodos asíncronos son para operaciones de E / S (donde hay cero hilos en espera mientras se realiza la operación de E / S y no hay ningún hilo tratando con ella). Pero llamar a un código (que usa async) como: métodos asíncronos es un poco confuso. ¿No crees? Porque supongo que hay otro hilo que se está ejecutando.
No veo la confusión. El método asincrónico clásico (como BeginRead()
, que se llama "Modelo de programación asincrónica" o APM) es una forma de iniciar una operación y recibir una notificación cuando se completa (a través de una devolución de llamada). El método asincrónico moderno (como ReadAsync()
, que se llama "Patrón asíncrono basado en tareas" o TAP) también es una forma de iniciar una operación y de recibir una notificación cuando se completa (usando await
).
En ambos casos, puede haber algún código que se ejecute antes de que el método regrese (el código antes del primero await
en el caso de TAP).
En ambos casos, la forma habitual de recibir notificaciones sobre el resultado no bloquea ningún subproceso (devolución de llamada para APM, await
TAP).
En ambos casos, puede usar bloqueo de espera si lo desea (llamando inmediatamente al método EndXxx()
para APM, Wait()
para TAP).
Ambos casos se pueden usar para ejecutar código síncrono en una BeginInvoke()
fondo ( BeginInvoke()
en un delegado para APM, Task.Factory.StartNew()
para TAP).
Nuevamente, no veo la confusión, los dos modelos me parecen muy similares.
Los métodos asíncronos no son solo para IO, pueden ser para nada, y sí, es solo otra manera de decir que el trabajo del método se ejecuta en un hilo separado. Cualquier método donde el hilo que llama descarga el trabajo a un hilo separado se puede llamar correctamente un método "asíncrono". Es lo mismo que Task<T>
y ContinueWith
- ContinueWith
es simplemente otra manera de hablar sobre una devolución de llamada, realmente.
La palabra "asíncrono" simplemente significa "no al mismo tiempo" : puede referirse a cualquier acción que ocurra independientemente la una de la otra.