5

我正在阅读TAP Whitepaper,并且对第 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秒完成”。这是示例中的错误还是我误解了它?

4

1 回答 1

3

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

“await download.TimeoutAfter(3000)”确保从任务中获取值不会花费太长时间。它不会给额外的 3s。

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

它可以替换为:

Bitmap bmp = download.Value;
于 2011-03-07T18:57:29.313 回答