暂停和继续线程 的微软解释,(Suspend /Resume )将不被支持.

[ 2006-05-10 15:54:53 | 作者: admin ]
字号: | |
暂停和继续线程


tianyang : 可怜啊,这么常用的函数不被支持了,还好2005提供了替代品.

原问: http://msdn2.microsoft.com/zh-cn/library/tttdef8x(VS.80).aspx


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

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

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

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

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

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

如果等待是托管等待,则 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。有关详细信息,请参见销毁线程。

挂起和继续(已过时)
要点
在 .NET Framework 2.0 版中,System.Threading.Thread.Suspend 和 System.Threading.Thread.Resume 方法已标记为过时,并将从未来版本中移除。
 

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

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

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

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

评论Feed 评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=544

这篇日志没有评论。

此日志不可发表评论。