Clase de tarea
La clase Task es una abstracción de operación asíncrona proporcionada después de .NET 4.0, con la ruta completa hacia System.Threading.Tasks.Task.
La clase Task se utiliza para representar operaciones asíncronas sin valor de retorno, y para operaciones asíncronas con valores de retorno, debe usarse la subclase Tarea de la clase Tarea<TResult>. Las tareas creadas por la clase Task se añaden al grupo de hilos.
Los <TResult>principales constructores de la clase Tarea/Tarea son los siguientes:
Una vez creada, la tarea puede iniciarse usando el método Start():
En el desarrollo real, el método estático Run() de la clase Task o el método miembro StartNew() de la clase fábrica TaskFactory se usan con mayor frecuencia para crear y comenzar nuevas tareas.
Algunos métodos comunes en la clase Task:
palabra clave async/await
C# 5.0 introdujo las palabras clave async y await, que ofrecían mejor soporte para la concurrencia a nivel de idioma.
El asíncrono se utiliza para marcar métodos asíncronos: La palabra clave asíncrona es una palabra clave contextual y solo se tratará como una palabra clave al modificar un método y Lambda, y se tratará como un identificador en otras áreas. La palabra clave asíncrona puede marcar métodos estáticos, pero no puntos de entrada (métodos Main()).
El valor de retorno del método etiquetado con async debe ser <TResult>uno de Tarea, Tarea o Nul. await se utiliza para esperar el resultado del método asincrónico:
La palabra clave await es igualmente contextual y solo se considera una palabra clave en el método etiquetado asincrónico. La palabra clave await puede usarse antes del método asíncrono y Task, y <TResult>Task, para esperar al final de la ejecución asíncrona. Una estructura sencilla de método asíncrono es la siguiente:
No es que el método esté marcado con la palabra clave asincrónica, es un método asincrónico, y las sentencias que aparecen directamente dentro del método asincrónico también se ejecutan de forma síncrona,El contenido ejecutado de forma asíncrona debe ejecutarse usando la clase Task。 De hecho, un método asíncrono que no contiene ninguna instrucción await se ejecutará de forma síncrona, momento en el que el compilador dará una advertencia.
Ejemplo sencillo, usando async/await para mostrar contenido simultáneamente en pantalla:
Salida: (Mono 4.4.0 y ArchLinux x64)
No es difícil ver en el programa anterior que en el método asíncrono etiquetado con palabra clave asíncrona, el código antes de usar await se ejecuta de forma sincrónica, y tras llamar await, el código restante se ejecuta asíncronamente en un hilo separado.
|