2010-12-02 21 views
5

Je lis à travers le TAP Whitepaper, et je suis confus par cet exemple donné pour la mise en œuvre d'un délai d'attente à la page 22:Async CTP - question de délai d'attente de travail

« Tenir compte d'une application d'interface utilisateur qui souhaite télécharger une image et désactiver L'interface utilisateur pendant le téléchargement de l'image Si le téléchargement prend trop de temps, l'interface utilisateur doit être réactivée et le téléchargement supprimé.

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; } 
} 

Ce qui me brouille est cette ligne:

Bitmap bmp = await download.TimeoutAfter(3000); 

Quel est le point de la TimeoutAfter à ce stade dans la logique? Cela n'aurait-il pas déjà été fait via l'appel à Task.WhenAny? Il semble que ce qu'il dit est: "Une fois la tâche de téléchargement terminée, donnez-lui 3 secondes de plus pour terminer." Est-ce une erreur dans l'exemple ou est-ce que je l'ai mal compris?

Répondre

3

Si Task.WhenAny renvoie le "téléchargement", cela signifie que le GetBitmapAsync est retourné sans temporisation.

La commande "await download.TimeoutAfter (3000)" garantit que l'extraction de la valeur de la tâche ne prend pas trop de temps. Il ne donne pas 3s supplémentaires.

Il semblerait difficile d'imaginer comment obtenir le résultat après la fin de la tâche initiale prendrait beaucoup de temps.

Il pourrait être remplacé par:

Bitmap bmp = download.Value;