7

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

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

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

4

4 回答 4

14

识别线程的最佳方法是通过其托管 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);
}
于 2008-11-25T19:06:48.600 回答
3

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

于 2009-01-11T21:30:50.700 回答
1

Y Low 的代码可以稍微改进...

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

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

  Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}
于 2008-11-25T19:55:30.390 回答
0

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

于 2008-11-25T19:06:30.690 回答