代码之家  ›  专栏  ›  技术社区  ›  Dror Helper

如何识别GC终结器线程?

  •  7
  • Dror Helper  · 技术社区  · 16 年前

    我尝试使用Thread.CurrentThread.Name,但它不起作用(返回null)。

    4 回复  |  直到 16 年前
        1
  •  14
  •   Yona    16 年前

    识别线程的最佳方法是通过其托管id:

    Thread.CurrentThread.ManagedThreadId;
    

    因为终结器总是在GC的线程中运行,所以您可以创建一个终结器,将线程id(或线程对象)保存在一个静态可验证文件中。

    样本:

    public class ThreadTest {
        public static Thread GCThread;
    
        ~ThreadTest() {
            ThreadTest.GCThread = Thread.CurrentThread;
        }
    }
    

    在代码中,只需创建此类的实例并执行垃圾收集:

    public static void Main() {
        ThreadTest test = new ThreadTest();
        test = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
    
        Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
    }
    
        2
  •  3
  •   Brian Rasmussen    16 年前

    !threads 命令将显示应用程序中的所有托管线程,并且终结器线程将用注释特别突出显示。

        3
  •  1
  •   VonC    16 年前

    public static void Main()
    {
      ThreadTest test = new ThreadTest();
      test = null;
    
      GC.Collect();
      GC.WaitForPendingFinalizers();
    
      Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
    }
    
        4
  •  0
  •   Carl Serrander    16 年前

    我认为即使使用调试API也不可能做到这一点,请参阅 this