2009-06-23 41 views
15

如果線程正在通過退出使用塊而釋放的對象中運行方法,會發生什麼情況?
實施例:C#退出使用()塊,其線程仍在作用域對象上運行

 
    using (SomeObject obj = new SomeObject()) 
    { 
     obj.param = 10 ; 
     Thread newThread = new Thread(() => { obj.Work(); }); 
     newThread.Start(); 
    } 
    ... 

obj.Work()是在一個新的線程運行,但OBJ是使用塊退出時,通常會得到釋放一個IDisposable的對象。如果線程在using塊結束後繼續運行會發生什麼?只有在線程完成後才能處理對象?或者線程會中斷嗎?

謝謝。

+0

而不是在線程外部使用using語句,把它放在線程中。 螺紋newThread =新主題(()=> { 使用(SomeObject OBJ =新SomeObject()){ obj.param = 10; obj.Work();} }); newThread.Start(); – Relster 2009-06-23 14:11:06

回答

4

請記住,IDisposable只是一種模式,並不釋放與該對象關聯的內存。在這種情況下,using塊的關閉將調用obj.Dispose,而使用obj的另一個線程將繼續運行。

這會給你造成奇怪的問題,因爲obj's狀態可能會改變,而另一個線程正在使用它(這一切都取決於如何實現Dispose方法)。毋庸置疑,IDisposable這個應用程序,線程和using聲明充其量是有問題的。

1

當使用塊在主線程上退出時,它會將.Dispose()對象引起,這可能會導致各種有趣的併發問題。但是,該對象不會被垃圾收集 - 它將保留,但處於無效狀態,具體取決於您的.Dispose()的實現。

11

有趣的事情會發生。

具體而言,SomeObject上的dispose方法將在調用Work之前或之後被調用,因爲它可能已經或可能未被調度爲由該點運行。

之後,它取決於SomeObject的dispose方法的作用;如果它釋放了一個沒有在「工作」中使用的SqlConnection,那麼就不會有問題;如果SomeObject預計它沒有被處置,你可能會在該線程中拋出一個異常。

+0

有趣的事情,好的。 – Groo 2009-06-23 14:23:05

2

該對象將在塊的末尾調用Dispose。它會繼續運行,但obj會變得不穩定,因爲Dispose會關閉連接等等。現在有可能會設置obj來檢查是否有某個正在使用中並在之後關閉它,但是我不會指望你已經寫了對象來處理這個。

相關問題