В настоящее время я читаю "Concurrency в кулинарной книге С#" Стивена Клири, и я заметил следующую технику:
var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
if (completedTask == timeoutTask)
return null;
return await downloadTask;
downloadTask - это вызов httpclient.GetStringAsync, а timeoutTask выполняет Task.Delay.
В случае отсутствия таймаута, downloadTask уже завершен. Зачем нужно делать второе ожидание, а не возвращать downloadTask.Result, учитывая, что задача уже завершена?