2012-06-21 12 views
30

que tienen el siguiente método que se activa cuando se produce una excepción en una parte de mi solicitud de metro¿Tengo derecho a ignorar la advertencia del compilador por falta de espera para esta llamada asincrónica?

void Model_ExceptionOccured(Exception ex) 
{ 
    var dlg = new Windows.UI.Popups.MessageDialog("An exception occured during verification: " + ex.Message, "Exception"); 
    dlg.ShowAsync(); 
} 

El 'dlg.ShowAsync()' - llamada es asíncrona, pero no me importa que esperar el resultado. El compilador genera una advertencia de que sin embargo:

Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.

que me importa? ¿Hay alguna razón para agregar la palabra clave await, que no sea para eliminar la advertencia?

Respuesta

27

De acuerdo con el siguiente enlace, la respuesta dada por alexm no es correcta. Las excepciones lanzadas durante una llamada asincrónica que no se espera se perderán. Para deshacerse de esta advertencia, debe asignar el valor de devolución de Tarea de la llamada asincrónica a una variable. Esto asegura que tiene acceso a cualquier excepción lanzada, que se indicará en el valor de retorno.

http://msdn.microsoft.com/en-us/library/hh965065(v=vs.110).aspx (VB.NET)

http://msdn.microsoft.com/en-us/library/hh873131.aspx (C#)

+0

En VS2012 cambiaron la política predeterminada para excepciones de tareas no observadas. El comportamiento predeterminado era terminar el proceso. – alexm

+0

el enlace que proporcionó muestra un error específico de VB. ¿Tiene una referencia similar para C#? – alexm

+0

http://msdn.microsoft.com/en-us/library/hh873131.aspx es la referencia de C#. – poke

6

El problema con esto es si el código en dlg.ShowAsync(); lanza una excepción que se quedará controlada y será re-lanzada más tarde por el subproceso finalizador potencialmente causa de su terminación del programa.

Lo que sucede en la realidad depende de .NET política de excepción

This article en MSDN menciones esto:

Si usted no espere en una tarea que se propaga a una excepción, o acceder a su propiedad Excepción , la excepción se escala de acuerdo con la política de excepciones .NET cuando la tarea se recolecta basura.

Cuando finalmente se envió VS 2012, la política predeterminada para excepciones de tareas no controladas cambió del proceso de terminación a la excepción de ignorar.

-1

me encontré con el mismo problema, y ​​aquí está mi solución:

que crea un objeto de tarea, asignada la salida del asíncrono función para el objeto Tarea, y usó un temporizador para verificar periódicamente el estado de la tarea.

He aquí un breve ejemplo: (en mi controlador de eventos Update_Click)

StatusLabel.Text = "Preparing " + feedArticleList1.Feed.Title; 
UpdateCheck.Enabled = true; 
UpdateTask = feedArticleList1.Feed.UpdateFeedAsync(); 

Más tarde, en el controlador de eventos para mi contador de tiempo, puedo comprobar UpdateTask.Status:

switch (UpdateTask.Status) 
{ 
    case TaskStatus.Canceled: 
    case TaskStatus.Created: 
    case TaskStatus.Running: 
    case TaskStatus.WaitingForActivation: 
    case TaskStatus.WaitingForChildrenToComplete: 
    case TaskStatus.WaitingToRun: 
     StatusLabel.Text = UpdateTask.Status.ToString(); 
     break; 
    case TaskStatus.RanToCompletion: 
     StatusLabel.Text = "Update Complete " + DateTime.Now.ToShortTimeString(); 
     UpdateCheck.Enabled = false; 
     break; 
    case TaskStatus.Faulted: 
     throw (UpdateTask.Exception); 
    default: 
     break; 
} 
+1

Puede utilice la tarea Exception y ContinueWith para obtener el mismo efecto; parece que está reinventando la rueda, especialmente al introducir la encuesta en métodos asíncronos. – Mathieson

Cuestiones relacionadas