Async CTP - вопрос о тайм-ауте задачи - PullRequest
5 голосов
/ 02 декабря 2010

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

1 Ответ

3 голосов
/ 07 марта 2011

Если Task.WhenAny возвращает «download», это означает, что GetBitmapAsync возвратился без истечения времени ожидания.

«Ожидание загрузки. TimeoutAfter (3000)» гарантирует, что получение значения из Задачи не займет слишком много времени. Это не дает дополнительные 3 с.

Казалось бы, трудно представить, как получение результата после завершения первоначального задания займет много времени.

Может быть заменено на:

Bitmap bmp = download.Value;
...