No momento, estou lendo " Concurrency in C # Cookbook ", de Stephen Cleary, e percebi a seguinte técnica:
var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
if (completedTask == timeoutTask)
return null;
return await downloadTask;
downloadTaské uma chamada para httpclient.GetStringAsynce timeoutTaskestá em execução Task.Delay.
Caso não tenha expirado, então downloadTaskjá está concluído. Por que é necessário fazer uma segunda espera em vez de retornar downloadTask.Result, visto que a tarefa já está concluída?
AggregateExceptioncom Resultvs primeira exceção via ExceptionDispatchInfocom await). Discutido com mais detalhes em "Manipulação de exceções de tarefas no .NET 4.5" de Stephen Toub: blogs.msdn.com/b/pfxteam/archive/2011/09/28/… )
downloadTasketimeoutTask? O que eles fazem?