18

try catch outside of: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);
      }
}
4

4 回答 4

13

如果您传递给的委托Task.Run引发异常,那么您可以在返回的任务之外捕获Task.Runawait

你不应该认为await它是一个块。没有“内部等待”之类的东西。相反,await可以将其视为接受单个参数的运算符(在这种情况下,Task返回 by Task.Run)。Task.Run将捕获其委托的异常并将它们放在返回的Task; await然后将传播该异常。

于 2013-07-17T15:51:06.110 回答
13

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

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

}

但是,由于您正在使用 ,因此 方法中很可能会有一些,这可能会受到结果的影响await-在这种情况下,使用around也是有意义的。TaskDoSomethingElseTestTasktry/catchawait

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 ....
      }
}
于 2013-07-17T17:51:35.583 回答
2

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

于 2013-07-17T15:53:29.167 回答
-1

这是 .Net 6 中的行为:

try{
 await Task.Run(()=>   & call whatever method    );
}
catch { handle the exception }          <-- the catch will never get hit. An unhandled exception in the Task.Run line will happen

但是,这将起作用:

try{
await Task.Run(async ()=> & call some method );
}
catch(Exception ex){
   handle the exception
}

()=> 之前的异步必须存在于 .Net 6

我刚刚证实了这一点。

于 2022-02-06T05:10:57.810 回答