Esperando por tarefas que retornam valores

Com Task <T> você é capaz de criar uma Tarefa, em um thread separado que retornará um valor. Este é um truque útil quando sua visualização precisa de informações genéricas de “boiler plate” de várias fontes antes da renderização.

Este código de amostra mostra a funcionalidade Task <T> genérica em um exemplo trivial. Seria possível estender este exemplo para um ciclo de carregamento de página ASP.NET WebForms iniciando suas Tarefas no PreLoad e esperando por elas no LoadComplete .

Este exemplo cria e inicia uma nova Tarefa <string $ gt; que dorme por 700 ms, em seguida, retorna uma string. Isso representa alguma atividade de E / S para um banco de dados ou sistema de arquivos ou serviço da web.

Enquanto essa Tarefa <string $ gt; está executando o thread principal do programa está livre para continuar a execução. Nesse caso, ele está fazendo um trabalho agitado contando até 5 enquanto tira uma soneca de 5ms entre cada número. Assim que a thread principal terminar seu trabalho, ela aguardará a Tarefa <string $ gt; completar. Se a Tarefa <string $ gt; retorna antes do tempo limite na espera, o valor do resultado será exibido no console.

void Main()
{
WriteOut(string.Empty);

Task<string> getUrlTask = Task<string>.Factory.StartNew(() => GetStringFromTask()) ;

for (int i = 0; i < 5; i++)
{
WriteOut("i is " + i);
Thread.Sleep(5);
}

if( getUrlTask.Wait(1000) )
{
WriteOut(getUrlTask.Result);
}else{
WriteOut("Took too long");
}
}

Este é o método que simulará a atividade de E / S para o banco de dados ou sistema de arquivos.

public string GetStringFromTask()
{
// Change this sleep value to > 1000 to see the "Took too long"
// message in Main
Thread.Sleep(700);
return "Happy Days";
}

Este é um método auxiliar usado para mostrar o tempo de execução de cada uma das mensagens de exibição.

public static void WriteOut(string message)
{
var now = DateTime.Now;
Console.WriteLine ("{0:#0.#00}: {1}", ((double) now.Second + (now.Millisecond/1000.0)), message);
}

Observe que este código foi copiado de um programa LINQPad “Programa C #” válido.

Saída de amostra:

24.147: 
24.147: i is 0
24.152: i is 1
24.157: i is 2
24.162: i is 3
24.167: i is 4
24.847: Happy Days

Como você pode ver, a string retornada de GetStringFromTask é exibida 700 ms após a Tarefa <string> ser criada e não 1000 ms especificados em Wait .