【问题标题】:How to identify the GC Finalizer thread?如何识别 GC Finalizer 线程?
【发布时间】:2008-11-25 18:46:40
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么需要知道哪个线程在运行GC?
  • 我的函数运行我不想在完成期间运行的代码
  • 除此之外真的很重要吗?有一个问题我想知道如何解决。
  • 当有人在回答问题时问“你为什么要这样做”时,你永远不应该被冒犯;通常,他们发现了一种模式,并试图确定他们是否可以为您的实际问题提出更清洁的解决方案。显然,如果您[继续],这有时会让您感到厌烦
  • 知道你在做什么,但你不应该觉得他们在质疑你的判断。

标签: .net multithreading finalizer


【解决方案1】:

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

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

    【讨论】:

      【解决方案3】:

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

      public static void Main()
      {
        ThreadTest test = new ThreadTest();
        test = null;
      
        GC.Collect();
        GC.WaitForPendingFinalizers();
      
        Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
      }
      

      【讨论】:

        【解决方案4】:

        我认为即使使用调试 API 也是不可能的,请参阅 this 博客文章了解更多信息。

        【讨论】:

          猜你喜欢
          • 2023-03-03
          • 1970-01-01
          • 2011-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-04
          • 2017-03-16
          • 1970-01-01
          相关资源
          最近更新 更多