线程挂起 阻止有什么区别c#

暂停和继续线程
.NET Framework 4 其他版本  Visual Studio 2008 Visual Studio 2005

同步线程活动的最常用方法是锁定和释放线程,或者锁定对象或代码区域。 有关这些锁定和阻止机制的更多信息,请参见 同步基元概述。

还可以让线程将自身置于休眠状态。 当线程被阻止或休眠时,可以使用 ThreadInterruptedException 使它们摆脱等待状态。

Thread.Sleep 方法
--------------------------------------------------------------------------------

调用 Thread.Sleep 方法会导致当前线程立即阻止,阻止时间的长度等于传递给 Thread.Sleep 的毫秒数,这样,就会将其时间片中剩余的部分让与另一个线程。 一个线程不能针对另一个线程调用 Thread.Sleep。

调用 Thread.Sleep 及 Timeout.Infinite 将使线程休眠,直到被调用 Thread.Interrupt 的另一个线程中断,或被 Thread.Abort 终止。

中断线程
--------------------------------------------------------------------------------

通过对被阻止的线程调用 Thread.Interrupt 来引发 ThreadInterruptedException,可以中断正在等待的线程,从而使该线程脱离造成阻止的调用。 线程应该捕获 ThreadInterruptedException 并执行任何适当的操作以继续运行。 如果线程忽略该异常,则运行时将捕获该异常并停止该线程。

 注意  
如果在调用 Thread.Interrupt 时未阻止目标线程,则该线程在阻止之前不会中断。 如果线程永远不会阻止,则它可能会在无任何中断的情况下完成。
 

如果等待是托管等待,则 Thread.Interrupt 和 Thread.Abort 都将立即唤醒线程。 如果等待是非托管等待(例如,平台调用对 Win32 WaitForSingleObject 函数的调用),则 Thread.Interrupt 和 Thread.Abort 都不能控制线程,直到线程返回到或调用到托管代码中。 在托管代码中,该行为如下:

Thread.Interrupt 将线程从它可能处于的任何等待中唤醒,并在目标线程中引发 ThreadInterruptedException。

Thread.Abort 与 Thread.Interrupt 相似,不同之处是它将导致在线程上引发 ThreadAbortException。 有关详细信息,请参见销毁线程。

挂起和继续(已过时)
--------------------------------------------------------------------------------

 重要事项  
在 .NET Framework 2.0 版中,Thread.Suspend 和 Thread.Resume 方法已标记为过时,并将从未来版本中移除。
 

还可以通过调用 Thread.Suspend 来暂停线程。 当线程针对自身调用 Thread.Suspend 时,调用将会阻止,直到另一个线程继续该线程。 当一个线程针对另一个线程调用 Thread.Suspend 时,调用是非组阻止调用,这会导致另一线程暂停。 无论调用了多少次 Thread.Resume,调用 Thread.Suspend 均会使另一个线程脱离挂起状态,并导致该线程继续执行。 例如,如果将 Thread.Suspend 连续调用五次,然后调用 Thread.Resume,则该线程将在调用 Thread.Resume 后立即继续执行。

与 Thread.Sleep 不同,Thread.Suspend 不会导致线程立即停止执行。 公共语言运行时必须一直等待,直到线程到达安全点之后它才可以将该线程挂起。 如果线程尚未启动或已经停止,则它将不能挂起。 有关安全点的详细信息,请参见 Thread.Suspend、垃圾回收和安全点。

 重要事项  
Thread.Suspend 和 Thread.Resume 方法通常并不是对所有应用程序都有用,并且不应将其与同步机制混淆。 由于 Thread.Suspend 和 Thread.Resume 不依赖于受控制线程的协作,因此,它们极具侵犯性并且会导致严重的应用程序问题,如死锁(例如,如果挂起的线程占有另一个线程需要的资源,就会发生这种情况)。
 

某些应用程序确实需要控制线程的优先级以提高性能。 为了做到这一点,应该使用 Priority 属性而不是 Thread.Suspend。

或者你可以到 http://msdn.microsoft.com/zh-cn/library/tttdef8x.aspx 去看看
希望对你有帮助
posted @ 2011-08-08 15:56  Yaoquan.Luo  阅读(713)  评论(0编辑  收藏  举报