thread.Resume,thread.Suspend,thread.Interrupt,thread.Abort
一.关于Thread.Resume和Thread.Suspend
在比照参考书敲示例程序时,出现如下警告,thread.Resume和thread.Suspend(包括stop)已过时,原因是在.Net Framework2.0当中就以被标记为过时,它不能保证完全的释放资源,如果您在安全权限评估期间挂起持有锁的线程,则AppDomain中的其他线程可能被阻止。如果执行类构造函数时,您挂起线程中的其他线程AppDomain中尝试使用类被阻止,很容易发生死锁。调用Suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定,此时,其他任何线程都不能访问锁定的资源,除非被“挂起“的线程恢复运行。对任何线程来说,如果他们想恢复目标线程,同时有试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用Suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。
二.关于Thread.Sleep
调用 System.Threading.Thread.Sleep方法会导致当前线程立即阻止,阻止时间的长度等于传递给 System.Threading.Thread.Sleep 的毫秒数,这样,就会将其时间片中剩余的部分让与另一个线程。一个线程不能针对另一个线程调用 System.Threading.Thread.Sleep。调用System.Threading.Sleep及System.Threading.Timeout.Infinite将使线程休眠,直到被调用System.Threading.Thread.Interrupt的另一个线程·中断,或被System.Threading.Thread.Abort终止。
如果等待是托管等待,则 System.Threading.Thread.Interrupt 和 System.Threading.Thread.Abort 都将立即唤醒线程。如果等待是非托管等待(例如,平台调用对 Win32 WaitForSingleObject 函数的调用),则 System.Threading.Thread.Interrupt 和 System.Threading.Thread.Abort 都不能控制线程,直到线程返回到或调用到托管代码中。在托管代码中,该行为如下:
System.Threading.Thread.Interrupt 将线程从它可能处于的任何等待中唤醒,并在目标线程中引发 ThreadInterruptedException。
System.Threading.Thread.Abort 与 System.Threading.Thread.Interrupt 相似,不同之处是它将导致在线程上引发 ThreadAbortException。
参照MSDN:https://msdn.microsoft.com/zh-cn/library/tttdef8x(VS.80).aspx

浙公网安备 33010602011771号