videos que puedes poner película para how hashtags google como adulto c# windows-runtime windows-store-apps async-await

c# - que - ¿Tengo razón en ignorar la advertencia del compilador por falta de espera para esta llamada asíncrona?



youtube google videos (3)

De acuerdo con el siguiente enlace, la respuesta dada por alexm no es correcta. Las excepciones lanzadas durante una llamada asíncrona 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 garantiza que tenga 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 #)

Tengo el siguiente método que se activa cuando ocurre una excepción en una parte de mi aplicación Metro

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

La llamada ''dlg.ShowAsync ()'' es asíncrona, pero no me interesa esperar el resultado. El compilador genera una advertencia para eso:

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.

¿Debería importarme? ¿Hay alguna razón por la que deba agregar la palabra clave await, aparte de deshacerme de la advertencia?


El problema con eso es si el código en dlg.ShowAsync(); arroja una excepción, no se manejará y se volverá a lanzar más adelante por el hilo del Finalizador, lo que podría causar la finalización del programa.

Lo que sucede en realidad depende de la política de excepciones de .NET

Este artículo en MSDN menciona esto:

Si no espera en una tarea que propaga una excepción, o accede a su propiedad Excepción, la excepción se escala de acuerdo con la política de excepción .NET cuando la tarea se recolecta de forma incorrecta.

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


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

Creé un objeto Task, asigné el resultado de la función async al objeto Task y usé un Timer para verificar periódicamente el estado de la tarea.

Aquí hay 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 de mi temporizador, verifico 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; }