我是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");
}
答案 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