我正在阅读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秒钟完成。”这是示例中的错误还是我误解了它?
答案 0 :(得分:3)
如果Task.WhenAny返回“下载”,则意味着返回的GetBitmapAsync没有超时。
“await download.TimeoutAfter(3000)”确保从任务中获取值不会花费太长时间。它没有提供额外的3s。
似乎很难想象在最初的任务完成后如何获得结果会花费很长时间。
可以替换为:
Bitmap bmp = download.Value;