尝试在外部捕获:等待任务.运行(()

本文关键字:等待 任务 运行 外部 | 更新日期: 2023-09-27 18:23:48

try-catch在: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在正常情况下不会引发异常。这应该没问题。

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

然而,由于您是await而不是Task,因此很可能在Test方法中会有一些DoSomethingElse,这可能会受到Task结果的影响——在这种情况下,在await周围设置try/catch也是有意义的。

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的委托引发异常,则当await返回任务时,可以在Task.Run之外捕获它。

你不应该把await看作是一个块。没有所谓的"等待的内部"。相反,将await视为一个接受单个参数的运算符(在本例中,是Task.Run返回的Task)。CCD_ 18将从其委托捕获异常并将它们放置在返回的CCD_ 19上;CCD_ 20随后将传播该异常。

您也可以将try-catch添加到外部代码中。当异步调用期间发生异常时,编译器将执行catch部分。以下是更多细节,为什么你需要试着四处接球等待http://msdn.microsoft.com/en-us/library/vstudio/0yd65esw.aspx异步方法中的look异常

这是.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

我刚刚证实了这一点。