Ai-je raison d’ignorer l’avertissement du compilateur pour le manque d’attente pour cet appel asynchrone?

La méthode suivante est déclenchée lorsqu’une exception se produit dans une partie de mon application Metro.

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

L’appel ‘dlg.ShowAsync ()’ est asynchrone, mais je ne me soucie pas d’attendre le résultat. Le compilateur génère un avertissement pour cela cependant:

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.

Dois-je m’en soucier? Y a-t-il une raison pour laquelle je devrais append le mot-clé wait, autre que pour supprimer l’avertissement?

Selon le lien ci-dessous, la réponse donnée par alexm n’est pas correcte. Les exceptions levées lors d’un appel asynchrone non attendu seront perdues. Pour vous débarrasser de cet avertissement, vous devez affecter la valeur de retour de la tâche de l’appel asynchrone à une variable. Cela garantit que vous avez access à toutes les exceptions levées, qui seront indiquées dans la valeur de retour.

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

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

Le problème avec cela est si le code dans dlg.ShowAsync(); jette une exception, elle sera laissée sans traitement et sera relancée plus tard par le thread de Finalizer, ce qui pourrait entraîner l’arrêt du programme.

Ce qui se passe en réalité dépend de la politique d’exception .NET

Cet article sur MSDN mentionne ceci:

Si vous n’attendez pas sur une tâche qui propage une exception ou n’accédez pas à sa propriété Exception, l’exception est transmise en fonction de la stratégie d’exception .NET lorsque la tâche est collectée.

Lorsque VS 2012 a finalement été expédié, la stratégie par défaut pour les exceptions de tâches non gérées est passée du processus en cours à ignorer l’exception.

J’ai rencontré le même problème, et voici ma solution:

J’ai créé un object Task, affecté la sortie de la fonction asynchrone à l’object Task et utilisé un minuteur pour vérifier périodiquement le statut de la tâche.

Voici un bref exemple: (dans mon gestionnaire d’événements Update_Click)

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

Plus tard, dans le gestionnaire d’événements de mon minuteur, je vérifie 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.ToSsortingng(); break; case TaskStatus.RanToCompletion: StatusLabel.Text = "Update Complete " + DateTime.Now.ToShortTimeSsortingng(); UpdateCheck.Enabled = false; break; case TaskStatus.Faulted: throw (UpdateTask.Exception); default: break; }