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

as7*_*s74 12 .net c# 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);
      }
}
Run Code Online (Sandbox Code Playgroud)

YK1*_*YK1 13

如果您Exception在委托内部处理(在您的情况下只是为了记录目的),await在正常情况下不会引发异常.这应该没问题.

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

}
Run Code Online (Sandbox Code Playgroud)

但是,因为你是await荷兰国际集团的Task,最可能的是,会有一些DoSomethingElseTest方法,它可能会通过对结果的影响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 ....
      }
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ary 8

如果您传递给委托Task.Run抛出一个异常,那么你就可以抓住它的外面Task.Run,当你await返回的任务.

你不应该认为await它是一块.没有"在等待中"之类的东西.相反,await可以将其视为一个带有单个参数的运算符(在本例中为Task返回的Task.Run).Task.Run将从其委托中捕获异常并将它们放在返回的Task; await然后将传播该异常.

  • 如果委托被标记为异步,则只能捕获异常(即使委托中没有await语句)`await Task.Run(async()=> {throw new Exception("msg");});` (4认同)
  • 我刚遇到同样的情况.我无法在`Task.Run`之外捕获`SQLException`,除非我在我的lambda中添加`async`关键字 (3认同)
  • @Arvis:不,你可以在`Task.Run`中没有`async`的情况下捕获它. (2认同)
  • @NonSecwitter可能只有调试器在“用户代码未处理”的异常上停止。 (2认同)