zoukankan      html  css  js  c++  java
  • 线程挂起 阻止有什么区别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 去看看
    希望对你有帮助
  • 相关阅读:
    Coursera 算法二 week 5 BurrowsWheeler
    pta 编程题7 List Leaves
    pta 编程题6 树的同构
    pta编程题5 Pop Sequence
    pat乙级1067
    pat乙级1060
    pat乙级1059
    1.ActionBar
    安卓开发必须收藏的网站
    genymotion常见问题解答
  • 原文地址:https://www.cnblogs.com/luoyaoquan/p/2131064.html
Copyright © 2011-2022 走看看