暂停和继续线程

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

还可以让线程将自身置于休眠状态。 当线程被阻止或休眠时,可以使用 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

ThreadInterruptedException

ThreadAbortException

概念

同步基元概述

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

其他资源

托管线程处理

使用线程和线程处理