.NET (C#) マルチスレッド アプリケーションを使用しており、ファイナライザー スレッド内で特定のメソッドが実行されているかどうかを知りたいです。
Thread.CurrentThread.Name を使用してみましたが、動作しません (null を返します)。
現在のスレッドにクエリを実行して、それがファイナライザー スレッドであるかどうかを確認する方法を知っている人はいますか?
.NET (C#) マルチスレッド アプリケーションを使用しており、ファイナライザー スレッド内で特定のメソッドが実行されているかどうかを知りたいです。
Thread.CurrentThread.Name を使用してみましたが、動作しません (null を返します)。
現在のスレッドにクエリを実行して、それがファイナライザー スレッドであるかどうかを確認する方法を知っている人はいますか?
スレッドを識別する最良の方法は、その管理対象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);
}
デバッグがオプションの場合は、WinDbg+SoS.dllを使用して簡単に見つけることができます。この!threads
コマンドは、アプリケーション内のすべての管理対象スレッドを表示し、ファイナライザースレッドはコメントで明確に強調表示されます。
Y Low のコードは少し改善される可能性があります...
public static void Main()
{
ThreadTest test = new ThreadTest();
test = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}
デバッグAPIを使用しても、それは不可能だと思います。詳細については、このブログ投稿を参照してください。