为什么没有为抛出异常的Task触发UnobservedTaskException事件处理程序?

时间:2014-07-21 22:26:57

标签: c# .net task-parallel-library unobserved-exception

我有以下测试程序,它设置 UnobservedTaskException ,但 OnTaskException 方法永远不会被执行。有什么想法吗?

注意

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

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();
}

1 个答案:

答案 0 :(得分: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();
}