首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别GC Finalizer线程?

如何识别GC Finalizer线程?
EN

Stack Overflow用户
提问于 2008-11-25 18:46:40
回答 4查看 4.2K关注 0票数 7

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-25 19:06:49

标识线程的最好方法是通过它的托管id:

代码语言:javascript
复制
Thread.CurrentThread.ManagedThreadId;

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

示例:

代码语言:javascript
复制
public class ThreadTest {
    public static Thread GCThread;

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

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

代码语言:javascript
复制
public static void Main() {
    ThreadTest test = new ThreadTest();
    test = null;
    GC.Collect();
    GC.WaitForPendingFinalizers();

    Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}
票数 14
EN

Stack Overflow用户

发布于 2009-01-11 21:30:51

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

票数 3
EN

Stack Overflow用户

发布于 2008-11-25 19:55:30

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

代码语言:javascript
复制
public static void Main()
{
  ThreadTest test = new ThreadTest();
  test = null;

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

  Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/318462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档