05  终止线程

 终止线程可以分别使用 Thread 类的 Abort 方法和 Join 方法实现,下面对这两个方法进行详细介绍。
 1.  Abort 方法 Abort 方法用来终止线程,它有两种重载形式,下面分别进行介绍。(1) 终止线程,在调用该方法的线程上引发 ThreadAbortException 异常,以开始终止该线程的过程。  语法如下:  public  void Abort()(2)终止线程,在调用该方法的线程上引发 ThreadAbortException 异常,以开始终止该线程并提供有关线程终止的异常信息的过程。 语法如下: public  void Abort(Object stateInfo) stateInfo:一个对象,它包含应用程序特定的信息(如状态),该信息可供正被终止的线程使用。例5 创建一个控制台应用程序,在其中开始一个线程,然后调用 Thread 类的 Abort 方法终止已开启的线程。代码如下:



static void Main(string[] args)
{
     Thread myThread;  //声明线程 
//用线程起始点的 ThreadStart 委托创建该线程的实例
myThread = new Thread(new ThreadStart(createThread));
     myThread.Start();                                    //启动线程 
     myThread.Abort();  //终止线程
}
public static void createThread()
{    
Console.Write("线程实例");
}



 注意         线程的 Abort 方法用于永久地停止托管线程,调用 Abort 方法时,公共语言运行库在目标线程中引发 ThreadAbortException 异常,目标线程可捕捉该异常,一旦线程被终止,它将无法重新启动。


     2.  Join 方法 Join 方法用来阻止调用线程,直到某个线程终止时为止。它有 3 种重载形式,下面分别进行介绍。(1)在继续执行标准的 COM 和 SendMessage 消息处理期间阻止调用线程,直到某个线程终止为止。语法如下:public  void Join()(2)在继续执行标准的 COM 和 SendMessage 消息处理期间阻止调用线程,直到某个线程终止或经过指定时间为止。 语法如下: public  bool Join(int millisecondsTimeout)C# 线程的基本操作(三)_公共语言  millisecondsTimeout:等待线程终止的毫秒数。C# 线程的基本操作(三)_公共语言  返回值:如果线程已终止,则为true;如果线程在经过 millisecondsTimeout 参数指定的时间量后未终止,则为 false。(3)在继续执行标准的 COM 和 SendMessage 消息处理期间阻止调用线程,直到某个线程终止或经过指定时间为止。语法如下:public  bool Join(TimeSpan timeout)C# 线程的基本操作(三)_公共语言  timeout:等待线程终止的时间量的 TimeSpan。C# 线程的基本操作(三)_公共语言   返回值:如果线程已终止,则为 true;如果线程在经过了 timeout 参数指定的时间量后来终止,则为 false。【例6】创建一个控制台应用程序,其中调用了 Thread 类的 Join 方法等待线程终止。代码如下:


static void Main(string[] args)
{
Thread myThread; //声明线程
//用线程起始点的 ThreadStart 委托创建该线程的实例
myThread = new Thread(new ThreadStart(createThread));
     myThread.Start();                                      //启动线程 
myThread Jion(); //阻止调用该线程,直到该线程终止
 }
 public static void createThread()
 {
     Console.write("线程实例");
 }



 注意         如果在应用程序中使用了多线程,辅助线程还没有执行完毕,在关闭窗体时必须关闭辅助线程,否则会引发异常。



06  线程的优先级

 线程的优先级指定一个线程相对于另一个线程的相对优先级,每个线程都有一个分配的优先级。在公共语言运行库内创建的线程最初被分配为 Normal 优先级,而在公共语言运行库外创建的线程,在进入公共语言运行库时将保留其先前的优先级。

线程是根据其优先级而调度执行的,用于确定线程执行顺序的调度算法随操作系统的不同而不同,在某些操作系统下,具有最高优先级(相对于可执行线程而言)的线程经过调度后总是首先运行。如果具有相同优先级的多个线程都可用,则程序将遍历处于该优先级的线程,并为每个线程提供一个固定的时间片段来执行。只有具有较高优先级的线程才可以运行,具有较低优先级的线程不会执行。如果在给定的优先级上不再有可运行的线程,则程序将移到下一个较低的优先级并在该优先级上调度线程以执行。如果具有较高优先级的线程可以运行,则具有较低优先级的线程将被抢先,并允许具有较高优先级的线程再次执行。除此之外,当应用程序的用户界面在前台和后台之间移动时,操作系统还可以动态调整线程的优先级。


说明         一个线程的优先级不影响该线程的状态,该线程的状态在操作系统可以调度该线程之前必须为 Running。


 线程的优先级值及说明如表3 所示。

表3   线程的优先级值及说明

C# 线程的基本操作(三)_优先级_05

可以通过访问线程的 Priority 属性来获取和设置其优先级。Priority 属性用来获取或设置一个值,该值指示线程的调度优先级。

语法如下:public  ThreadPriority Priority { get; set; }属性值:ThreadPriority 值之一。默认值为 Normal。【例7】创建一个控制台应用程序,其中创建了两个Thread 线程类对象,并设置第一个 Thread 类对象的优先级为最低,然后调用 Start 方法开启这两个线程。代码如下:


static void Main(string[] args)
{
    Thread thrad1=wnew Thread(new ThreadStart(Thread1));             //使用自定义方法 Thread1 声明线程 
    thread1.Priority = ThreadPriority.Lowest; //设置线程的调度优先级
    Thread thread2 = new Thread(new ThreadStart(Thread2)); //使用自定义方法 Thread2 声明线程
    thread1.Start();  //开启线程一
    thread2.Start(); //开启线程二
}
static void Thread1()
{
     Console.WriteLine("线程一"); 
}
static void Thread2()
{
     Console.WriteLine("线程二")
}

程序的运行结果如图4 所示。

C# 线程的基本操作(三)_应用程序_06

图4 设置线程的优先级





END -




C# 线程的基本操作(三)_应用程序_07




关注小编不迷路呦

-----------------------------------