2010-12-02 100 views
5

我读通过TAP Whitepaper,并感到22页,在实施超时定此示例困惑:异步CTP - 任务超时问题

“考虑一个想要下载的图像和禁用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秒钟完成。”这是这个例子中的错误还是我误解了它?

回答

3

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

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

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

Bitmap bmp = download.Value; 

它可以被替换