暂停和继续线程

更新:2007 年 11 月

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

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

Thread.Sleep 方法

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

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

中断线程

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

说明:

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

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

挂起和继续(已过时)

重要说明:

在 .NET Framework 2.0 版中,Thread.SuspendThread.Resume 方法已标记为过时,并将从未来版本中移除。

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

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

重要说明:

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

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

请参见

概念

同步基元概述

Thread.Suspend、垃圾回收和安全点

参考

Thread

ThreadInterruptedException

ThreadAbortException

其他资源

托管线程处理

使用线程和线程处理