任务超时问题

我正在阅读TAP白皮书,并且对第22页的实现超时所给出的示例感到困惑:

“考虑一个UI应用程序,它希望在图像下载时下载图像并禁用UI,但如果下载时间过长,则应该重新启用UI,并且应该放弃下载。”

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秒钟完成。” 这是这个例子中的错误还是我误解了它?


如果Task.WhenAny返回“下载”,则意味着GetBitmapAsync没有超时返回。

“等待download.TimeoutAfter(3000)”确保从任务中获取值不会花费太长时间。 它不会提供额外的3秒。

似乎很难想象如何在最初的任务完成后获得结果将需要很长时间。

它可以替换为:

Bitmap bmp = download.Value;
链接地址: http://www.djcxy.com/p/39519.html

上一篇: Task timeout question

下一篇: How to set HttpResponse timeout for Android in Java