Rob*_*b H 5 c# asynchronous c#-5.0 async-ctp
我正在阅读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; }
}
Run Code Online (Sandbox Code Playgroud)
令我困惑的是这一行:
Bitmap bmp = await download.TimeoutAfter(3000);
Run Code Online (Sandbox Code Playgroud)
在这个逻辑中,TimeoutAfter的重点是什么?这不应该是通过调用Task.WhenAny完成的吗?它似乎正在说的是,"下载任务完成后,再给它3秒钟完成." 这是示例中的错误还是我误解了?
如果 Task.WhenAny 返回“下载”,则意味着 GetBitmapAsync 返回且没有超时。
“await download.TimeoutAfter(3000)”确保从任务中获取值不会花费太长时间。它不会给予额外的 3 秒。
似乎很难想象最初的任务完成后要花很长时间才能得到结果。
它可以替换为:
Bitmap bmp = download.Value;
Run Code Online (Sandbox Code Playgroud)