Async CTP - вопрос о тайм-ауте задачи
Я читаю Технический документ TAP, и меня смущает этот пример, приведенный для реализации тайм-аута на странице 22:
"Рассмотрим приложение пользовательского интерфейса, которое хочет загрузить изображение и отключить пользовательский интерфейс во время загрузки изображения. Однако, если загрузка занимает слишком много времени, пользовательский интерфейс должен быть повторно включен, а загрузка должна быть отклонена".
public async void btnDownload_Click(object sender, EventArgs e)
{
btnDownload.Enabled = false;
try
{
Task<Bitmap> download = GetBitmapAsync(url);
if (download == await Task.WhenAny(download, Task.Delay(3000)))
{
Bitmap bmp = await download.TimeoutAfter(3000);
pictureBox.Image = bmp;
status.Text = “Downloaded”;
}
else
{
pictureBox.Image = null;
status.Text = “Timed out”;
download.ContinueWith(t => Trace(“Task finally completed”));
}
}
finally { btnDownload.Enabled = true; }
}
Что меня смущает, так это строка:
Bitmap bmp = await download.TimeoutAfter(3000);
Какой смысл в TimeoutAfter на этом этапе в логике? Разве это не должно было быть достигнуто через вызов Task.WhenAny? Похоже на то, что говорится: "После завершения задачи загрузки дайте ей еще 3 секунды". Это ошибка в примере или я ее неправильно понимаю?
1 ответ
Если Task.WhenAny возвращает "download", это означает, что GetBitmapAsync возвратился без истечения времени ожидания.
"Await download.TimeoutAfter(3000)" гарантирует, что получение значения из Задачи не займет слишком много времени. Это не дает дополнительные 3 с.
Казалось бы, трудно представить, как получение результата после завершения первоначальной задачи займет много времени.
Его можно заменить на:
Bitmap bmp = download.Value;