Pensé que eran básicamente lo mismo: escribir programas que dividen las tareas entre procesadores (en máquinas que tienen 2+ procesadores). Entonces estoy leyendo esto , que dice:
Los métodos asíncronos están destinados a ser operaciones sin bloqueo. Una expresión de espera en un método asíncrono no bloquea el hilo actual mientras se ejecuta la tarea esperada. En cambio, la expresión registra el resto del método como una continuación y devuelve el control al llamador del método asíncrono.
Las palabras clave asíncronas y en espera no hacen que se creen hilos adicionales. Los métodos asincrónicos no requieren subprocesos múltiples porque un método asincrónico no se ejecuta en su propio hilo. El método se ejecuta en el contexto de sincronización actual y usa el tiempo en el hilo solo cuando el método está activo. Puede usar Task.Run para mover el trabajo vinculado a la CPU a un subproceso en segundo plano, pero un subproceso en segundo plano no ayuda con un proceso que solo está esperando que los resultados estén disponibles.
y me pregunto si alguien puede traducir eso al inglés para mí. Parece establecer una distinción entre asincronicidad (¿es eso una palabra?) Y subprocesos e implica que puede tener un programa que tiene tareas asincrónicas pero no subprocesamiento múltiple.
Ahora entiendo la idea de tareas asincrónicas como el ejemplo en la pág. 467 de C # In Jon Deke Skeet en profundidad, tercera edición
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
La async
palabra clave significa " Esta función, siempre que se llame, no se llamará en un contexto en el que se requiera su finalización para todo después de que se llame su llamada".
En otras palabras, escribirlo en medio de alguna tarea
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, ya que DisplayWebsiteLength()
no tiene nada que ver con x
o y
, hará DisplayWebsiteLength()
que se ejecute "en segundo plano", como
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
Obviamente ese es un ejemplo estúpido, pero ¿estoy en lo correcto o estoy totalmente confundido o qué?
(Además, estoy confundido acerca de por qué sender
y e
nunca se usan en el cuerpo de la función anterior).
sender
y e
estamos sugiriendo que este es en realidad un controlador de eventos, prácticamente el único lugar donde async void
es deseable. Lo más probable es que esto se llame al hacer clic en un botón o algo así; el resultado es que esta acción ocurre de forma completamente asincrónica con respecto al resto de la aplicación. Pero todavía está todo en un hilo: el hilo de la interfaz de usuario (con un pequeño lapso de tiempo en un hilo de IOCP que publica la devolución de llamada en el hilo de la interfaz de usuario).
DisplayWebsiteLength
ejemplo de código: no debe usarse HttpClient
en una using
declaración: bajo una carga pesada, el código puede agotar la cantidad de sockets disponibles, lo que resulta en errores de SocketException. Más información sobre instanciación incorrecta .