1

我有下面的测试程序,它设置了UnobservedTaskException但是OnTaskException方法永远不会执行。有任何想法吗?

注意

如果我删除“ for 循环”,那么一切都会按预期工作。

static void Main()
{
    SetupUnobservedTaskExceptionHandling();

    Task.Factory.StartNew(() =>
    {
        var counter = 5;
        for (; counter > 0; counter--)
        {
            Console.WriteLine(counter);
            Thread.Sleep(1000);
        }
        throw new InvalidCastException("I threw up!");
    });

    GC.Collect();
    GC.WaitForPendingFinalizers();
    Console.ReadLine();
}

private static void SetupUnobservedTaskExceptionHandling()
{
    TaskScheduler.UnobservedTaskException += OnTaskException;
}

private static void OnTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
    Console.WriteLine("Error!" + e.Exception);
    e.SetObserved();
}
4

1 回答 1

2

您不是在等待任务完成执行。这意味着您的应用程序将在任务引发异常之前结束。

如果您只是添加一个Thread.Sleep并让任务抛出异常,您将收到通知:

private static void Main()
{
    SetupUnobservedTaskExceptionHandling();

    Task.Factory.StartNew(() =>
    {
        var counter = 5;
        for (; counter > 0; counter--)
        {
            Console.WriteLine(counter);
            Thread.Sleep(1000);
        }
        throw new InvalidCastException("I threw up!");
    });

    Thread.Sleep(10000);

    GC.Collect();
    GC.WaitForPendingFinalizers();
    Console.ReadLine();
}
于 2014-07-21T22:32:42.040 回答