Это имеет смысл, если timeoutTask
является произведением Task.Delay
, которое я считаю тем, что есть в книге.
Task.WhenAny
возвращает Task<Task>
, где внутренняя задача является одной из тех, которые вы передали в качестве аргументов. Его можно было бы переписать следующим образом:
Task<Task> anyTask = Task.WhenAny(downloadTask, timeoutTask);
await anyTask;
if (anyTask.Result == timeoutTask)
return null;
return downloadTask.Result;
В любом случае, поскольку downloadTask
уже завершен, между return await downloadTask
и return downloadTask.Result
существует очень незначительная разница. Именно в этом будет бросок AggregateException
, который обертывает любое исходное исключение, как указано в комментариях @KirillShlenskiy. Первый будет просто перебрасывать исходное исключение.
В любом случае, где бы вы ни обрабатывали исключения, вы должны в любом случае проверить наличие AggregateException
и его внутренних исключений, чтобы получить причину ошибки.