从Task.Run()冒泡异常

时间:2019-03-21 19:49:03

标签: c# asynchronous async-await task

我有下面的代码,并且我试图冒泡来自testFunction()的异常。当我尝试运行代码时,不会抛出异常。

testFunction是我要定期调用的任务

但是,如果我明确添加throw new CustomException();在Task.Run中,代码正确抛出。我无法理解这种行为。我无法等待或等待Task.Run,​​因为我想要task.Run自己独立运行,因此我正在使用ContinueWith,但continueWith没有捕获异常,因此不会抛出该异常。请告诉我我在这里想念什么?

public class Example
{

   public static CancellationTokenSource source = new CancellationTokenSource();
   public static void Main()
   {
       Console.WriteLine("Hello start");
       Task.Run(async () => 
       {

           while(token.IsCancellationRequested)
           {
               token.ThrowIfCancellationRequested();
               await testFunction(source.Token); 
               await Task.Delay(1000,token);                   
           }
                       
       } ).ContinueWith((t) =>
                        {                                
                           if (t.Exception != null) throw t.Exception;
                        });
   }
      
   public static async Task testFunction(CancellationToken token)
   {
       throw new CustomException();

   }
}

1 个答案:

答案 0 :(得分:0)

  

我无法等待或等待Task.Run,​​因为我希望Task.Run自己独立运行

您必须使用await来观察异常。不过,您不必立即使用await。您可以将Task保存在变量中,以后根据需要await保存。

  

因此我正在使用ContinueWith

ContinueWith不会做async / await做不到的任何事情。 ContinueWith对您没有帮助。 It should actually almost never be used

  

我正在尝试冒泡来自testFunction()的异常。

让我扭转一下:在哪里? to 在哪里冒泡? 代码的哪一部分将观察到该异常?回答该问题后,您将找到放置await的位置。