任务超时问题
我正在阅读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