Essayez Catch en dehors de: wait Task.Run (()

Est-ce que essayer attraper en dehors de: await Task.Run(() => un sens ou les utilise-t-il uniquement à l’intérieur de wait?

 private async void Test() { try { await Task.Run(() => { try { DoingSomething(); } catch (Exception ex) { log.Error(ex.Message); } }); } catch (Exception ex) { log.Error(ex.Message); } } 

Si vous gérez une Exception à l’intérieur du délégué (dans votre cas, uniquement à des fins de journalisation), await ne await pas d’exception dans des circonstances normales. Cela devrait aller.

 private async Task Test() { await Task.Run(() => { try { DoingSomething(); } catch (Exception ex) { log.Error(ex.Message); } }); } 

Cependant, étant donné que vous await la Task , il y aura très probablement une méthode DoSomethingElse dans la méthode de Test , qui pourrait être affectée par le résultat de la Task – auquel cas, il est également logique de prévoir un try/catch await .

 private async Task Test() { try { await Task.Run(() => { try { DoingSomething(); } catch (SomeSpecialException spex) { // it is OK to have this exception log.Error(ex.Message); } }); DoSomethingElse(); // does not run when unexpected exception occurs. } catch (Exception ex) { // Here we are also running on captured SynchronizationContext // So, can update UI to show error .... } } 

Si le délégué que vous passez à Task.Run lève une exception, vous pouvez alors la récupérer en dehors de Task.Run lorsque vous await la tâche renvoyée.

Vous ne devriez pas penser à await comme s’il s’agissait d’un bloc. Il n’y a pas une telle chose comme “à l’intérieur d’attendre”. Pensez plutôt à await comme à un opérateur prenant un seul argument (dans ce cas, la Task renvoyée par Task.Run ). Task.Run intercepte les exceptions de son délégué et les place dans la Task renvoyée; await alors propager cette exception.

Vous pouvez aussi append catch à un code extérieur. Le compilateur exécutera la section catch lorsqu’une exception se produit pendant l’appel asynchrone. Voici plus de détails sur la raison pour laquelle vous avez besoin d’essayer d’attraper l’attente http://msdn.microsoft.com/en-us/library/vstudio/0yd65esw.aspx look Exceptions in Async Methods