码迷,mamicode.com
首页 > 编程语言 > 详细

C#多线程实践——线程状态

时间:2015-05-22 00:16:56      阅读:572      评论:0      收藏:0      [点我收藏+]

标签:

线程状态关系图

技术分享

  在.NET Framework中,可以通过ThreadState属性获取线程的执行状态。上图标识出三种状态“层”,ThreadState以按位计算的方式组合状态层,每种状态层的成员之间都是互斥的,下面是所有的三种状态“层”:

  • 运行 (running) / 阻止 (blocking) / 终止 (aborting) 状态(上图显示)
  • 后台 (background) / 前台 (foreground) 状态 (ThreadState.Background)
  • 不建议使用的Suspend 方法(ThreadState.SuspendRequested 和 ThreadState.Suspended)挂起的过程

        总的来说,ThreadState是按位组合零或每个状态层的成员!一个简单的ThreadState示例如下:

Unstarted

Running

WaitSleepJoin

Background, Unstarted

SuspendRequested, Background, WaitSleepJoin

     这些枚举的成员中StopRequested 和 Aborted两个从来没被用过,至少当前CLR实现上每月使用过。

     另外,ThreadState.Running潜在的值为0 ,因此代码不会被执行:

if ((t.ThreadState & ThreadState.Running) > 0) ...

  这种情况下,需要使用线程的IsAlive属性来代替按位与非操作符。不过IsAlive的结果可能不是想要的,因为线程在在被阻止或挂起的时候也会返回true(只有在线程未开始或已正常结束时它才为false)。

      避开不推荐使用的Suspend 和 Resume方法,可以写一个helper方法除去所有除了第一种状态层的成员。线程的后台状态可以通过IsBackground 获得,所以实际上只有第一种状态层拥有有用的信息。

public static ThreadState SimpleThreadState (ThreadState ts)
 
{
    return ts & (ThreadState.Aborted | ThreadState.AbortRequested |
    ThreadState.Stopped | ThreadState.Unstarted |
    ThreadState.WaitSleepJoin);
}

  ThreadState对调试或程序概要分析很重要,不过在多线程协同的情况下就没这么方便了,因为没有一个可靠的机制可以不考虑ThreadState的变化而仅通过判断ThreadState来执行信息。

C#多线程实践——线程状态

标签:

原文地址:http://www.cnblogs.com/johnvwan/p/4520990.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!