2010-12-02 14 views
5

estoy leyendo a través de la TAP Whitepaper, y estoy confundido por esta muestra dada para la implementación de un tiempo de espera en la página 22:asíncrono CTP - Tarea cuestión de tiempo de espera

"Consideremos una aplicación de interfaz de usuario, que quiere descargar una imagen y desactivar la interfaz de usuario mientras la imagen se está descargando. Si la descarga tarda demasiado tiempo, sin embargo, la interfaz de usuario debe volver a habilitar la descarga y debe ser descartada ".

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

Lo que me confunde es esta línea:

Bitmap bmp = await download.TimeoutAfter(3000); 

¿Cuál es el punto de la TimeoutAfter en este punto de la lógica? ¿No debería haberlo logrado ya a través de la llamada a Task.WhenAny? Parece que lo que está diciendo es: "Después de que la tarea de descarga haya terminado, concédele 3 segundos más para finalizar". ¿Es esto un error en el ejemplo o lo estoy malinterpretando?

Respuesta

3

If the Task.WhenAny devuelve la "descarga" significa que GetBitmapAsync se devuelve sin tiempo de espera.

La opción "aguardar descarga.TiempoDespués Después (3000)" asegura que obtener el valor de la Tarea no lleva demasiado tiempo. No da 3s adicionales.

Parecería difícil imaginar cómo obtener el resultado una vez que la tarea finaliza inicialmente tomaría mucho tiempo.

Se podría sustituir por:

Bitmap bmp = download.Value; 
Cuestiones relacionadas