Em termos de ciência da computação, a Taské um futuro ou uma promessa . (Algumas pessoas usam esses dois termos de maneira sinomizada, outros usam de maneira diferente, ninguém pode concordar com uma definição precisa .) Basicamente, uma Task<T>"promessa" de devolver a você T, mas não agora, querida, estou meio ocupada, por que não você volta mais tarde?
A Threadé uma maneira de cumprir essa promessa. Mas nem todo mundo Taskprecisa de um novinho em folha Thread. (De fato, criar um encadeamento geralmente é indesejável, porque é muito mais caro do que reutilizar um encadeamento existente no conjunto de encadeamentos. Mais sobre isso daqui a pouco.) Se o valor que você está esperando for do sistema de arquivos ou de um banco de dados ou na rede, não há necessidade de um encadeamento ficar aguardando os dados quando ele pode atender a outras solicitações. Em vez disso, eles Taskpodem registrar um retorno de chamada para receber o (s) valor (es) quando estiverem prontos.
Em particular, o Taskque não dizer por que é que leva um longo tempo para retornar o valor. Ele pode ser que ele leva muito tempo para calcular, ou pode que leva um longo tempo para buscar. Somente no primeiro caso você usaria a Threadpara executar a Task. (No .NET, os threads são muito caros, então você geralmente deseja evitá-los o máximo possível e realmente usá-los apenas se desejar executar vários cálculos pesados em várias CPUs. Por exemplo, no Windows, um thread pesa 12 KiByte ( Eu acho que), no Linux, um thread pesa apenas 4 KiByte, em Erlang / BEAM até apenas 400 bytes. No .NET, é 1 MiByte!)