尝试Catch以外:await Task.Run(()

尝试在外面捕获: await Task.Run(() =>有意义还是只在await中使用它们?

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

如果您在委托中处理Exception (在您的情况下仅用于记录目的), await将不会在正常情况下引发exception。 这应该没问题。

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

但是,由于您正在await Task ,很可能在Test方法中会有一些DoSomethingElse ,它可能会受到Task结果的影响 – 在这种情况下,有一个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 .... } } 

如果传递给Task.Run的委托引发exception,那么当您await返回的任务时,可以在Task.Run之外捕获它。

你不应该想到awaitawait了。 没有“在等待中”的东西。 相反,可以将await视为采用单个参数的运算符(在本例中为Task.Run返回的Task.Run )。 Task.Run将从其委托中捕获exception并将它们放在返回的Task ; await将传播该exception。

您也可以将try catch添加到外部代码中。 当异步调用期间发生exception时,编译器将执行catch部分。 这里有更多详细信息为什么你需要尝试捕获等待http://msdn.microsoft.com/en-us/library/vstudio/0yd65esw.aspx看异步方法中的exception