任务中的异常存储在哪里?

时间:2012-12-18 11:53:55

标签: .net c#-4.0 exception-handling

如果我在以下示例中取消注释Wait()startNew.Result的行,我会抓住AggregateException。如果这些代码行被注释,为什么我看不到任何异常?

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Task<int> startNew = Task.Factory.StartNew(() => int.Parse(""), 
                                             TaskCreationOptions.LongRunning);
            //int result = startNew.Result;
            //startNew.Wait();
            Thread.Sleep(10000);             
        }
        catch (AggregateException ex)
        {
            Console.WriteLine("Catched in aggregated");
        }
        catch (Exception)
        {
            Console.WriteLine("Catched in general");
        }

        Console.WriteLine("The end");
        Console.ReadLine();
    }
}

2 个答案:

答案 0 :(得分:2)

  

但是,如果这些代码行被注释,为什么我看不到任何例外?

因为什么都没有扔掉它们!你真的不希望想要从一个线程中的异常被抛出到任意一个点的不同线程中,而你没有做任何事情来导致它。

Task<> 会记住异常,但除非您专门执行Wait()Result之类的操作,否则它不会抛出它们见过。

您还可以使用Task.Exception检查错误。

答案 1 :(得分:0)

Jon Skeet是对的,但他的答案并不完整。

我应该补充一点,如果你不调用Wait()或Result,那么你可以面对在Task对象上调用Finalize方法的情况,并且该调用将检查异常内部任务对象集合中是否存在异常然后抛出UnobservedTaskException导致立即应用程序崩溃的原因(只要你没有为TaskScheduler.UnobservedTaskException注册一个回调,强烈不推荐)。