尝试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
之外捕获它。
你不应该想到await
它await
了。 没有“在等待中”的东西。 相反,可以将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