您的位置:首页 > 编程语言

.NET多线程编程(6)——如何操纵一个线程

2009-09-18 23:20 190 查看
  下面我们就动手来创建个线程使用Thread类创建线程时只需提供线程入口即可(线程入口使知道该让这个线程干什么事)
  在C#中线程入口是通过ThreadStart代理(delegate)来提供你可以把ThreadStart理解为个指针指向线程要执行当Thread.Start思路方法后线程就开始执行ThreadStart所代表或者说指向
  打开你VS.net新建个控制台应用(Console Application)编写完全控制个线程代码举例:
//ThreadTest.cs
using;
using.Threading;
ThreadTest
{
  publicAlpha
  {
      publicvoidBeta
      {
        while(true)
        {
          Console.WriteLine("Alpha.Betaisrunninginitsownthread.");
        }
      }
  };
  publicSimple
  {
      publicMain
      {
        Console.WriteLine("ThreadStart/Stop/JoinSample");
        AlphaoAlpha=Alpha;
        file://这里创建个线程使的执行Alpha类Beta思路方法
        ThreadoThread=Thread(ThreadStart(oAlpha.Beta));
        oThread.Start;
        while(!oThread.IsAlive)
           Thread.Sleep(1);
        oThread.Abort;
        oThread.Join;
        Console.WriteLine;
        Console.WriteLine("Alpha.Betahasfinished");
        try
        {
          Console.WriteLine("TrytorestarttheAlpha.Betathread");
          oThread.Start;
        }
        catch(ThreadStateException)
        {
          Console.Write("ThreadStateExceptiontryingtorestartAlpha.Beta.");
          Console.WriteLine("Expectedsinceabortedthreadscannotberestarted.");
          Console.ReadLine;
        }
        0;
      }
  }
}
  这段包含两个类Alpha和Simple在创建线程oThread时我们用指向Alpha.Beta思路方法化了
ThreadStart代理(delegate)对象当我们创建线程oThreadoThread.Start思路方法启动时实际上运行是
Alpha.Beta思路方法:
  Alpha oAlpha = Alpha;
  Thread oThread = Thread( ThreadStart(oAlpha.Beta));
  oThread.Start;
  然后在Mainwhile循环中我们使用静态思路方法Thread.Sleep让主线程停了1ms这段时间CPU转向执行线
程oThread然后我们试图用Thread.Abort思路方法终止线程oThread注意后面oThread.JoinThread.Join思路
方法使主线程等待直到oThread线程结束你可以给Thread.Join思路方法指定个型参数作为等待最长时间的后我
们试图用Thread.Start思路方法重新启动线程oThread但是显然Abort思路方法带来后果是不可恢复终止线程所
以最后会抛出ThreadStateException异常
  主线程Main
  所有线程都是依附于Main所在线程Main是C#入口起始线程可以称的为主线程
  如果所有前台线程都停止了那么主线程可以终止而所有后台线程都将无条件终止
  所有线程虽然在微观上是串行执行但是在宏观上你完全可以认为它们在并行执行
  Thread.ThreadState 属性
  这个属性代表了线程运行时状态在区别情况下有区别值我们有时候可以通过对该值判断来设计流程
  ThreadState 属性取值如下:
  Aborted:线程已停止;
  AbortRequested:线程Thread.Abort思路方法已被但是线程还未停止;
  Background:线程在后台执行和属性Thread.IsBackground有关;
  Running:线程正在正常运行;
  Stopped:线程已经被停止;
  StopRequested:线程正在被要求停止;
  Suspended:线程已经被挂起(此状态下可以通过Resume思路方法重新运行);
  SuspendRequested:线程正在要求被挂起但是未来得及响应;
  Unstarted:未Thread.Start开始线程运行;
  WaitSleepJoin:线程了Wait,Sleep或Join等思路方法处于封锁状态;
  上面提到了Background状态表示该线程在后台运行那么后台运行线程有什么特别地方呢?其实后台线程
跟前台线程只有个区别那就是后台线程不妨碍终止旦个进程所有前台线程都终止后CLR(通用语言运行环境)将通
过任意个存活中后台进程Abort思路方法来彻底终止进程
  线程优先级
  当线程的间争夺CPU时间时CPU 是按照线程优先级给予服务在C#应用中用户可以设定5个区别优先级由高
到低分别是HighestAboveNormalNormalBelowNormalLowest在创建线程时如果不指定优先级那么系统默
认为ThreadPriority.Normal
  给个线程指定优先级我们可以使用如下代码:
  //设定优先级为最低
  myThread.Priority=ThreadPriority.Lowest;
  通过设定线程优先级我们可以安排些相对重要线程优先执行例如对用户响应等等
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: