.net 如何识别GC终结器线程?

.net 如何识别GC终结器线程?,.net,multithreading,finalizer,.net,Multithreading,Finalizer,我有一个.NET(C#)多线程应用程序,我想知道某个方法是否在终结器线程中运行 我尝试使用Thread.CurrentThread.Name,但它不起作用(返回null) 有人知道如何查询当前线程以发现它是否是终结器线程吗?我认为即使使用调试API也不可能,有关详细信息,请参阅博客文章。识别线程的最佳方法是通过其托管id: Thread.CurrentThread.ManagedThreadId; 因为终结器总是在GC的线程中运行,所以您可以创建一个终结器,将线程id(或线程对象)保存在一个静

我有一个.NET(C#)多线程应用程序,我想知道某个方法是否在终结器线程中运行

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


有人知道如何查询当前线程以发现它是否是终结器线程吗?

我认为即使使用调试API也不可能,有关详细信息,请参阅博客文章。

识别线程的最佳方法是通过其托管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);
}

Y Low的代码可以稍微改进一下

public static void Main()
{
  ThreadTest test = new ThreadTest();
  test = null;

  GC.Collect();
  GC.WaitForPendingFinalizers();

  Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}

如果调试是一个选项,您可以使用WinDbg+SoS.dll轻松找到它。
!threads
命令显示应用程序中的所有托管线程,并用注释特别突出显示终结器线程

为什么您需要知道哪个线程正在运行GC?我的函数运行我不想在终结期间运行的代码。此外,它真的很重要吗?有一个问题我想找到解决方法。当有人回答一个问题时问你“你为什么要那样做”,你永远不应该生气;通常,他们已经发现了一种模式,并试图确定他们是否能够为您的实际问题提出一个更干净的解决方案。显然,如果你(继续)知道自己在做什么,这有时会让你感到厌烦,但你不应该觉得他们在质疑你的判断。