异步 CTP - 任务超时问题

5

我正在阅读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 秒钟时间完成。” 这是示例中的错误还是我误解了它?
1个回答

3

如果Task.WhenAny返回“download”,这意味着GetBitmapAsync在没有超时的情况下返回了。

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

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

它可以被替换为:

Bitmap bmp = download.Value;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接