2009-10-12 62 views
14

Thraed.Abort()和Thread.Interrupt()之間的區別是什麼?我怎樣才能以線程安全的方式給他們打電話。如果提供了簡單的例子,這將會很有幫助。.NET中線程中斷和中斷之間的區別

+0

你能提供一個你想要做什麼的例子嗎?你的問題的當前形式有矛盾。 – Gary 2009-10-12 18:00:25

回答

23

首先,這些都不是好的線程同步結構。

首先,Thread.Abort說:「我不在乎你在做什麼,只是停止做,並保持現在的一切。它基本上是說「嘿,揍它」的編程方式。如果您的線程正在打開文件,那些文件將保持打開狀態,直到垃圾回收完成並最終確定您的對象。

Thread.Abort應該只能在應用程序域被拆除的情況下被使用,甚至可能不會被使用,最好只在進程被終止的情況下。

其次,Thread.Interrupt是一個相當奇怪的野獸。它基本上說「我不在乎你在等什麼,不要再等待它了」。這裏的奇怪之處在於,如果線程當前不在等待任何事情,那就是「我不在乎你將要等下一個什麼,但是當你這樣做時,立刻停止等待」。

這些都是跡象表明,你正在將自己的意志強加於並非旨在被告知此類事情的線程上。

爲了正確中止線程,線程應定期檢查某種標誌,無論是簡單易變的布爾變量還是事件對象。如果標誌顯示「你現在應該終止」,那麼線程應該以有序的方式從方法返回來終止自己。

爲了正確地喚醒線程,線程應該在需要等待同步對象的地方包含一個「請停止等待」的對象,它也會等待。所以基本上它會讓它所需要的對象變成信號,或者「停止等待」對象變成信號,確定哪個對象做了什麼,並做正確的事情。

所以不是Thread.Abort的和了Thread.interrupt,你應該使用正常的同步對象,如事件,互斥,信號等

出於同樣的原因,Thread.SuspendThread.Resume應該被單獨留在家中寫你的線程,並且它們在.NET的更高版本中也被廢棄了。

10

除非你調用當前執行的線程上AbortInterrupt(如ASP.NET不會突然終止請求,例如),你基本上不能叫他們一個線程安全的方式。

使用WaitHandleMonitor.Wait/Pulse以可喚醒的方式等待。如果你正在拆卸應用程序,你應該只中止其他線程,否則你可能會以未知狀態結束。

請參閱my article on graceful thread termination瞭解如何很好地完成此操作的示例。

+0

好的文章Jon.By的方式我可以在哪裏找到您的網絡廣播? – user186973 2009-10-12 18:12:17

+0

@threadinglearner:你的意思是網播嗎? – 2009-10-12 18:32:37

+0

關於C的任何事情# – user186973 2009-10-12 18:50:39

2

Thread.Abort()在目標線程上產生ThreadAbortException。它通常是爲了強制線程終止。停止線程處理不是推薦的做法。

Thread.Interrupt()中斷一個處於WaitSleepJoin狀態的線程 - 實際上阻塞了像WaitHandle這樣的資源。這允許調用者解除對線程的阻塞。

兩者都不是真正的「線程安全」 - 即它們專門用於以難以預測的方式影響線程行爲。

通常建議使用同步對象(如WaitHandles或Semaphores)來允許線程安全地彼此同步。

1

Abort和Interrupt之間的區別在於,雖然它們都會拋出一個異常(ThreadAbortException和ThreadInterruptException),但調用Abort會重新拋出catch塊末尾的異常,並確保結束正在運行的線程。