2011-06-25 60 views
6

我一直在閱讀代碼和多線程應用程序的例子。不時我看到一個片段,像這樣:一旦線程啓動,我應該保持對線程的引用嗎?

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"); 
    } 
} 

它不斷地困擾着我:我應該保持的參考(前景)線程的地方?畢竟,它是Go方法中的局部變量。因此,一旦Go的執行完成,線程引用應該被垃圾收集。或許,也許,線程在執行時會被GCed?

如果是後臺線程,答案會改變嗎?

在此先感謝!

回答

4

線程是一個對象,其壽命是通過垃圾收集器控制的一個例子。底層是一個操作系統對象。只要線程正在運行代碼,這就是活着的。 Thread類只是它的一個包裝。另一個例子是一個窗口,只要你的代碼或用戶沒有關閉窗口,它就一直存在。 Winforms不要求您持有對Form類包裝器的引用。而且你通常不會:

Application.Run(new Form1()); 

是鍋爐板代碼,你不持有對任何地方的Form1類實例的引用。

您可以隨時從現有的運行線程重新創建一個Thread對象。你用Thread.CurrentThread這樣做。而且它不一定是您使用線程構造函數創建的線程。它可以在線程池線程中使用。或者不是由託管代碼啓動的線程。你的程序的主線將是一個很好的例子,它是由Windows啓動的。

儘管如此,失去對線程的引用並不是好的做法。這意味着你不能檢查它是否仍在運行。這意味着當它停止時你無法阻止它。例如,用戶想要退出程序時。

2

你只需要保持基準的保持,如果你以後要使用它。在這種情況下,直到線程完成後垃圾收集纔會啓動。

前景線程和後臺線程之間的唯一區別在於前臺線程保持託管執行環境的運行。

這意味着正在運行的前臺線程將阻止您的應用程序關閉,而後臺程序則不會。

Source

相關問題