Я читаю TAP Whitepaper , и меня смущает этот пример, приведенный для реализации тайм-аута на странице 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 секунды». Это ошибка в примере или я ее неправильно понимаю?