7

.NET (C#) マルチスレッド アプリケーションを使用しており、ファイナライザー スレッド内で特定のメソッドが実行されているかどうかを知りたいです。

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 に答える