2009-10-12 45 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块末尾的异常,并确保结束正在运行的线程。