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

时间:2013-07-17 15:34:10

标签: c# .net try-catch async-await

尝试捕获:await Task.Run(() =>是否有意义或仅在等待中使用它们?

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

3 个答案:

答案 0 :(得分:13)

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

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

}

但是,由于await Task DoSomethingElse很可能,Test方法中会有一些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 .... } } 周围{{1}}也是有意义的。

{{1}}

答案 1 :(得分:8)

如果您传递给Task.Run的代理人引发了异常,那么当您Task.Run返回任务时,您可以在await之外将其捕获。

您不应该将await视为一块。没有“在等待中”之类的东西。相反,将await视为采用单个参数的运算符(在本例中为Task返回的Task.Run)。 Task.Run将从其委托中捕获异常并将其放在返回的Task上;然后await将传播该异常。

答案 2 :(得分:1)

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