任务中的异常未导致应用程序崩溃

时间:2019-04-24 07:50:56

标签: c# task

我是Task Parallel Library的新手。我知道前台线程和后台线程中的异常以相同的方式工作,即它们传播到主线程并使应用程序崩溃(如果未处理)。但是,我在使用任务时看到了不同的行为。当任务中发生异常时,它只是结束执行而不会崩溃应用程序或其他任务。如果我没看错,则Task使用后台线程,因此异常应传播到主线程并像正常的后台线程一样崩溃。

public static void Foo()
{
  throw new Exception("Blahh");
}
static void Main()
{
   Task t = Task.Run(()=>Foo());
   Thread.Sleep(500);
   Console.WriteLine("Main");
}

2 个答案:

答案 0 :(得分:2)

您应该Wait() Task。如果任务产生结果,则可以访问调用Result的{​​{1}}属性。请注意,例外将是Wait(),原始例外将在其AggregateException集合中。

InnerExceptions

答案 1 :(得分:1)

您应将代码更改为

public static void Foo()
{
  throw new Exception("Blahh");
}
static async Task Main()
{
   Task t = Task.Run(()=>Foo());
   Thread.Sleep(500);

   await t;

   Console.WriteLine("Main");
}

您现在要做的是运行即发即弃任务。所以您实际上说,我不在乎结果(即使是例外)。

await任务表示您想知道任务的结果。 在这种情况下,您可以执行此操作以了解任务是否成功完成(或引发异常)。

看看这个:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/await#exceptions