2008-11-25 18 views
7

.NET (C#) çok iş parçacıklı bir uygulamam var ve Finalizer iş parçacığı içinde belirli bir yöntemin çalışıp çalışmadığını bilmek istiyorum.GC Sonlandırıcı ipliği nasıl belirlenir?

Thread.CurrentThread.Name kullanmayı denedim ama işe yaramıyor (null döndürür).

Sonlandırıcı iş parçacığının olup olmadığını anlamak için mevcut iş parçacığını nasıl sorgulayabilirim?

+0

Neden hangi iş parçacığının GC'yi çalıştırdığını bilmeniz gerekiyor? –

+0

Evet, tam olarak neden? – peterchen

+0

Benim fuction, sonlandırma sırasında çalıştırmak istemediğim kodu çalıştırıyor –

cevap

14

bir iş parçacığı tanımlamanın en iyi yolu onun yönetilen id geçer Statik olarak doğrulanabilir.

Örnek: Kodunuzdaki

public class ThreadTest { 
    public static Thread GCThread; 

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

sadece bu sınıfın bir örneğini oluşturmak ve bir çöp toplama yapın:

public static void Main() { 
    ThreadTest test = new ThreadTest(); 
    test = null; 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 

    Console.WriteLine(ThreadTest.GCThread.ManagedThreadID); 
} 
Y Low kodu hafifçe geliştirilebilir
0

Hata ayıklama API'lerini kullanmanın mümkün olduğunu düşünmüyorum, daha fazla bilgi için bkz. this blog yazısı. Bir sonlandırıcı daima GC'ın parçacığı çalışır yana

Thread.CurrentThread.ManagedThreadId; 

Konunun İD numarasını kurtaracak bir finalizer (veya iş parçacığı nesnesi) oluşturabilirsiniz:

1

...

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

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

    Console.WriteLine(ThreadTest.GCThread.ManagedThreadID); 
} 
3

Hata ayıklama bir seçenekse, WinDbg + SoS.dll dosyasını kullanarak kolayca bulabilirsiniz. !threads komutu, uygulamadaki tüm yönetilen konuları görüntüler ve sonlandırıcı iş parçacığı özellikle bir yorumla vurgulanır.