Dos nuevas palabras clave agregadas al lenguaje C# 5.0 son asincrónicas y esperan, ambas funcionan mano a mano para ejecutar un método C# de forma asincrónica sin bloquear el hilo de llamada.
que obtiene a través de la propósito de la función, pero le da demasiada "crédito" a la función esperan ser asíncrono /.
Permítanme ser muy, muy claro en este punto: await
no hace mágicamente que un método síncrono se ejecute de forma asíncrona. No inicia un nuevo hilo y ejecuta el método en el nuevo hilo, por ejemplo. El método que está llamando tiene que 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?
Una vez más, eso es por completo según el método que llame al. Todo lo que await
hace es ordenar al compilador que reescriba el método en un delegado que se puede pasar como la continuación de la tarea asincrónica. Es decir, await FooAsync()
significa "llamar al FooAsync()
y todo lo que regrese debe ser algo que represente la operación asíncrona que acaba de iniciar. Dígale a la cosa que cuando sepa que la operación asíncrona está hecha, debería 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 llama cronogramas trabaja 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 preguntar, pero probablemente debería tener es:
Cuando la tarea asíncrona está terminado y el control continúa donde lo dejó, es la ejecución en el mismo hilo como lo era 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.
Depende del objeto awaitable devuelto por el método async. – phoog
Ninguno. Son solo azúcar sintáctico. Enhebrar depende del 'SynchronizationContext' actual y de la 'Tarea' que esperas. – CodesInChaos