En términos informáticos, a Task
es un futuro o una promesa . (Algunas personas usan esos dos términos de manera sinónimo, algunos los usan de manera diferente, nadie puede ponerse de acuerdo en una definición precisa ). Básicamente, una Task<T>
"promesa" de devolverle un T
, pero no ahora, cariño, estoy un poco ocupado, ¿por qué no? vuelves mas tarde?
A Thread
es una forma de cumplir esa promesa. Pero no todos Task
necesitan un nuevo Thread
. (De hecho, la creación de un subproceso a menudo no es deseable, porque hacerlo es mucho más costoso que reutilizar un subproceso existente del conjunto de subprocesos. Más sobre eso en un momento). Si el valor que está esperando proviene del sistema de archivos o un base de datos o la red, entonces no hay necesidad de un subproceso para sentarse y esperar los datos cuando pueden atender otras solicitudes. En cambio, Task
podrían registrar una devolución de llamada para recibir los valores cuando estén listos.
En particular, el Task
qué no dicen qué es lo que se necesita mucho tiempo para devolver el valor. Se podría ser que se necesita mucho tiempo para calcular, o puede que se necesita mucho tiempo para buscarlo. Solo en el primer caso usarías a Thread
para ejecutar a Task
. (En .NET, los subprocesos son extremadamente caros, por lo que generalmente desea evitarlos tanto como sea posible y realmente solo los usa si desea ejecutar múltiples cálculos pesados en múltiples CPU. Por ejemplo, en Windows, un subproceso pesa 12 KiByte ( Creo que), en Linux, un hilo pesa tan solo 4 KiByte, en Erlang / BEAM incluso solo 400 Byte. ¡En .NET, es 1 MiByte!)