【问题标题】:Triggering finalizer in the VS2010 debugger在 VS2010 调试器中触发终结器
【发布时间】:2012-06-26 07:17:43
【问题描述】:

对托管代码使用VS2010调试器是否可以触发终结器线程运行?

用例:

使用Tasks 可能会在Task 对象的终结器上抛出异常,如果任务它 self 抛出了异常,并且没有得到处理。

验证导致未处理的错误修复可能很耗时,因为您需要等待终结器线程启动,然后才能确保修复正常工作。

我自己通常不使用终结器进行编码,因为它会引起很多头痛,而且我还向 Microsoft 发送了有关此问题的邮件。但是虽然它是这样的:如何触发终结器代码以从调试器运行 而不是从代码运行。

【问题讨论】:

    标签: .net visual-studio-2010 debugging task-parallel-library finalizer


    【解决方案1】:

    AFAIK 没有特殊的方法可以从调试器中执行此操作。

    您可以在代码中触发它:

        int i = 0, j = 1;
        new Task(() => Console.WriteLine(j/i)).Start();
        Thread.Sleep(1000); // make sure it has had plenty of time
        //GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
        //GC.WaitForPendingFinalizers();
        Console.WriteLine("Did I explode yet?");
        Console.ReadKey();
    

    现在取消注释这两行以查看异常出现。

    请注意,这应该用于测试等场景;你真的不应该在你的常规代码中使用GC

    【讨论】:

    • 感谢您的回答!帮了我很多。虽然还不能接受。我把这段代码放在一个只有在调试过程中才能看到的按钮中,就像一个魅力。
    猜你喜欢
    • 2010-09-23
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多