C# 从Task.Run()冒泡出现异常

C# 从Task.Run()冒泡出现异常,c#,asynchronous,async-await,task,C#,Asynchronous,Async Await,Task,我有下面的代码,我正试图冒泡出testFunction()中出现的异常。当我尝试运行代码时,没有抛出异常 testFunction是一个我想在固定时间间隔内调用的任务 但是,如果我显式添加throw new CustomException();在Task.Run中,代码正确抛出。我无法理解这种行为。我无法等待或等待该任务。运行是因为我希望该任务。运行是独立运行的,因此我使用ContinueWith,但ContinueWith没有捕获异常,因此不会抛出异常。请告知我这里缺少什么 public cl

我有下面的代码,我正试图冒泡出testFunction()中出现的异常。当我尝试运行代码时,没有抛出异常

testFunction是一个我想在固定时间间隔内调用的任务

但是,如果我显式添加throw new CustomException();在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();

   }
}
我不能等待或等待任务。运行是因为我想要任务。运行是为了独立运行

您必须使用
wait
来观察异常。不过,您不必立即使用
wait
。您可以将
任务
保存在一个变量中,并在需要时等待它

因此我使用ContinueWith

ContinueWith
不会执行
async
/
wait
无法执行的任何操作<代码>继续使用对您没有帮助

我试图冒泡出testFunction()中出现的异常


让我把这个问题转过来:例外情况将走向何方?它往哪里冒气泡代码的哪一部分将观察到该异常?回答该问题后,您将找到将
wait

放置在何处的代码有几个问题:1)您不需要该任务。请运行,因为
testFunction
已经是异步的。2) 您不需要ContinueWith,因为异常会自动冒泡。3) 你不会等待你的任务。因此,您的程序将在任务结束之前结束,即使不是这样,您的异常也会被吞没。将
Main
标记为async,或者对任务调用Wait()方法。您的主方法仍将并发运行,直到您将
Wait
Wait
放在任何位置。我需要以固定的间隔调用testFunction,因此需要无限循环。但您仍然不需要任务。运行,因为异步是由Task.Delay完成的。如果执行
publicstaticasynctask Main(){var Task=testFunctionWithWhileLoop(…);MyOtherProgramCode();wait Task;}
则带有while循环的任务将在后台运行,而其他程序代码将与之并行运行。