2010-12-02 3 views
5

ich durch die TAP Whitepaper bin zu lesen, und bin verwirrt durch diese für die Implementierung eines Timeout auf Seite Probe 22:Async CTP - Aufgabe Timeout Frage

„ein UI-Anwendung betrachten, die ein Bild herunterladen will, und deaktivieren die Benutzeroberfläche während das Bild heruntergeladen wird. Wenn der Download zu lange dauert, sollte die Benutzeroberfläche jedoch wieder aktiviert werden und der Download sollte verworfen werden. "

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

Was mich verwirrt, ist diese Zeile:

Bitmap bmp = await download.TimeoutAfter(3000); 

Was ist der Sinn des TimeoutAfter an dieser Stelle in der Logik? Sollte dies nicht bereits über den Aufruf von Task.WhenAny geschehen sein? Es scheint so zu sein, als würde es sagen: "Nachdem die Download-Aufgabe beendet ist, geben Sie ihr noch 3 Sekunden, um sie zu beenden." Ist das im Beispiel ein Fehler oder missverstehe ich es?

Antwort

3

Wenn Task.WhenAny den "Download" zurückgibt, bedeutet das, dass GetBitmapAsync ohne Zeitüberschreitung zurückgegeben wurde.

Das "erwarten Download.TimeoutAfter (3000)" stellt sicher, dass das Abrufen des Werts aus der Aufgabe nicht zu lange dauert. Es gibt keine zusätzlichen 3s.

Es wäre schwer vorstellbar, wie das Ergebnis nach der ersten Aufgabe lange dauern würde.

Es könnte mit ersetzt werden:

Bitmap bmp = download.Value;