whenall understanding method httpresponsemessage example ejemplos ejemplo create await async c# asynchronous parallel-processing multicore c#-5.0

c# - understanding - ¿Las nuevas palabras clave C ''5.0'' async ''y'' await ''usan múltiples núcleos?



task whenall c# (4)

Dos nuevas palabras clave añadidas al lenguaje C # 5.0 son asincrónicas y están a la espera, y ambas funcionan mano a mano para ejecutar un método C # de forma asincrónica sin bloquear el hilo de llamada.

Eso atraviesa el propósito de la función, pero otorga demasiado "crédito" a la función async / await.

Permítanme ser muy, muy claro sobre este punto: await no causa mágicamente que un método sincrónico se ejecute de forma asincrónica. No inicia un nuevo hilo y ejecuta el método en el nuevo hilo, por ejemplo. El método que está llamando debe ser lo que sepa cómo ejecutarse de manera asíncrona. Cómo elige hacerlo es su negocio.

Mi pregunta es, ¿estos métodos realmente aprovechan múltiples núcleos y se ejecutan en paralelo o el método asíncrono se ejecuta en el mismo núcleo del subproceso que la persona que llama?

Nuevamente, eso depende completamente del método que usted llame . Todo lo que await hacer es instruir al compilador para que reescriba el método en un delegado que se puede pasar como la continuación de la tarea asincrónica. Es decir, la await FooAsync() significa que "llame a FooAsync() y lo que regrese debe ser algo que represente la operación asíncrona que acaba de comenzar. Dígale a eso que cuando sabe que la operación asíncrona está hecha, debe llamar a este delegado " El delegado tiene la propiedad de que cuando se invoca, el método actual parece reanudarse "donde lo dejó".

Si el método que llamas cronogramas funciona en otro hilo afinitizado a otro núcleo, genial. Si inicia un temporizador que hace ping a algún controlador de eventos en el futuro en el hilo de UI, genial. await no le importa Todo lo que hace es asegurarse de que cuando se realiza el trabajo asincrónico, el control puede reanudarse donde lo dejó.

Una pregunta que no hizo pero probablemente debería tener es:

Cuando la tarea asíncrona finaliza y el control continúa donde se quedó, ¿se ejecuta en el mismo hilo que antes?

Depende del contexto. En una aplicación de winforms en la que espera algo de la secuencia de comandos de la interfaz de usuario, el control vuelve a aparecer en el hilo de la interfaz de usuario. En una aplicación de consola, tal vez no.

Dos nuevas palabras clave añadidas al lenguaje C # 5.0 son async y están a la await , y ambas funcionan mano a mano para ejecutar un método C # de forma asincrónica sin bloquear el hilo de llamada.

Mi pregunta es, ¿estos métodos realmente aprovechan múltiples núcleos y se ejecutan en paralelo o el método asíncrono se ejecuta en el mismo núcleo del subproceso que la persona que llama?


Como async y await se basan en TPL, deberían funcionar de manera muy similar. De forma predeterminada, debe tratarlos como si se ejecutaran en un hilo separado.


Eric Lippert tiene una excelente respuesta; Solo quería describir el paralelismo async un poco más.

El enfoque simple "serial" es donde await solo una cosa a la vez:

static void Process() { Thread.Sleep(100); // Do CPU work. } static async Task Test() { await Task.Run(Process); await Task.Run(Process); }

En este ejemplo, el método de Test pondrá en cola Process al grupo de subprocesos, y cuando se complete, pondrá en cola Process nuevamente al grupo de subprocesos. El método de Test se completará después de ~ 200 ms. En cualquier momento, solo un hilo está realmente moviendo el progreso hacia adelante.

Una forma simple de paralelizar esto es usar Task.WhenAll :

static void Process() { Thread.Sleep(100); // Do CPU work. } static async Task Test() { // Start two background operations. Task task1 = Task.Run(Process); Task task2 = Task.Run(Process); // Wait for them both to complete. await Task.WhenAll(task1, task2); }

En este ejemplo, el método de Test pone en cola el Process al grupo de subprocesos dos veces, y luego espera a que ambos se completen. El método de Test se completará después de ~ 100 ms.

Task.WhenAll (y Task.WhenAny ) se introdujeron con async / await para admitir el paralelismo simple. Sin embargo, el TPL todavía está allí si necesita algo más avanzado (el verdadero procesamiento en paralelo con CPU es mejor para el TPL). TPL funciona bien con async / await .

async paralelismo async básico en mi entrada de blog async , así como el "contexto" al que Eric aludió.


Un método asíncrono devuelve un objeto a disposición (uno que tiene un método GetAwaiter ), y el compilador puede generar código para consumir ese objeto si llama al método con la palabra clave await . También puede llamar a dicho método sin la palabra clave await y consumir el objeto explícitamente.

El objeto encapsula una acción asincrónica, que puede o no ejecutarse en otro subproceso. El artículo de Eric Lippert Asynchrony en C # 5.0 parte cuatro: No es magia, se considera un ejemplo de programación asincrónica que involucra solo un hilo.