2011-06-20 57 views
3

它使垃圾收集任何區別,如果我們在方法的範圍,而不是在類範圍聲明一個線程,如:線程創建範圍和垃圾收集

//scenario 1 
public class Foo 
{ 
    public Foo() 
    { 
     new Thread(()=> /*engine*/) { IsBackground = true }.Start(); 
    } 
} 

//scenario 2 
public class Bar 
{ 
    private readonly Thread _engineThread = null; 

    public Bar() 
    { 
     _engineThread = new Thread(()=> /*engine*/) { IsBackground = true }; 
     _engineThread.Start(); 
    } 
} 

回答

5

是 - 在第一種方法中,一旦底層線程完成,Thread對象將有資格進行垃圾回收。

在第二種方法中,如果Bar的實例仍然符合垃圾收集,這將阻止垃圾收集Thread對象。我懷疑這會對底層操作系統線程產生任何影響,請關注你。

雖然我不會考慮GC的影響 - 我會專注於可讀性。出於某種原因,您是否需要對該後臺線程進行引用?如果是這樣,請使用第二種方法,以便它可用。如果你不需要需要它,它將作爲一個領域是毫無意義的。

+1

在場景1或場景2中,'Foo'或'Bar'的實例是否可以在線程結束之前進行垃圾回收?如果是,可以在線程結束之前收集它們嗎? – remio

+2

@remio:是的,如果沒有任何引用它們,它們可能被垃圾收集。 –