2011-06-25 10 views
6

Çok parçalı uygulamaların kodlarını ve örneklerini okuyamaya devam ediyorum. Zaman zaman ben bir pasajı şöyle bakın:Başladıktan sonra bir iş parçacığına bir referans mı tutmalıyım?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("started"); 
     Go(); 
     Console.WriteLine("press [ENTER] to quit"); 
     Console.ReadLine(); 
    } 

    private static void Go() 
    { 
     var thread = new Thread(DoSomething); 
     thread.Start(); 
    } 

    private static void DoSomething() 
    { 
     Console.WriteLine("doing something"); 
    } 
} 

Ve beni rahatsız tutar: Ben bir yere (önde) iplik referansı tutmalı? Sonuçta, Go yönteminde yerel bir değişken. Bu nedenle, Go'un yürütülmesi tamamlandığında, iş parçacığı referansı çöp toplanmalıdır. Öyleyse belki, belki de, yürütürken iş parçacığı GCed olacak?

Arka plan iş parçacığıysa, yanıt değişecek mi?

Şimdiden teşekkürler!

cevap

4

bir iplik süresi çöp toplayıcı tarafından kontrol edilen olmayan bir nesnenin bir örnektir. Kapağın altında bir işletim sistemi nesnesidir. Bir iş parçacığı kod çalıştırdığı sürece yaşıyor. Konu sınıfı sadece bunun için bir sarıcıdır. Başka bir örnek bir penceredir, kodunuz veya kullanıcı onu kapatmadığı sürece canlıdır. Winforms, Form sınıfı sarmalayıcıya bir başvuru tutmanızı gerektirmez. Ve çok tipik yok:

Application.Run(new Form1()); 

kazan plaka kodu her yerde Form1 sınıf örneği başvurusu tutmayın.

Varolan bir iş parçacığından her zaman bir Thread nesnesini yeniden oluşturabilirsiniz. Thread.CurrentThread ile bunu yaparsınız. Ve iş parçacığı oluşturucu ile oluşturduğunuz bir iş parçacığı olması gerekmez. Bir threadpool iplik içinde kullanılabilir. Veya yönetilen kod tarafından başlatılmamış bir iş parçacığı. Programınızın ana konusu bunun iyi bir örneği olabilir, Windows tarafından başlatıldı. Bununla birlikte, bir iş parçacığına bir başvuru kaybetmek iyi bir uygulama değildir. Hala çalışıyor olduğunu kontrol edemeyeceğinizi ima eder. Hangi durması gerektiğinde onu durduramayacağınızı ima eder. Kullanıcı örneğin programınızdan çıkmak istediğinde.

2

Yalnızca daha sonra kullanmak isterseniz referans bırakmamak gerekir:

İşte davranışı açıklayan bir makale. Bu durumda, iş parçacığı bitinceye kadar çöp toplama başlamaz.

Ön plan ve arka plan iş parçacıkları arasındaki tek fark, ön plan iş parçacığının yönetilen yürütme ortamının çalışmasını engellemesidir.

Bu, çalışan bir ön plan iş parçacığının uygulamanızın kapanmasını engelleyeceği anlamına gelir;

Source

İlgili konular