CSDN第一期总结之三:Thread的问题
C#是一门支持多线程的语言,因此线程的使用也是比较常见的。由于线程的知识在Win32编程的时候已经说得过多,所以在.Net中很少介绍这部分(可能.Net不觉得这部分是它所特有的)。  
那么线程相关的问题大致有如下四类(这篇文章只讨论单线程、单线程与UI线程这两方面的问题)。
问题一,线程的基本操作,例如:暂停、继续、停止等;
问题二,如何向线程传递参数或者从中得到其返回值;
问题三,如何使线程所占用的CPU不要老是百分之百;
最后一个,也是问题最多的,就是如何在子线程来控制UI中的控件,换句话说,就是在线程中控制窗体某些控件的显示。  
对于问题一,我不建议使用Thread类提供的Suspend、Resume以及Abort这三个方法,前两个有问题,好像在VS05已经屏蔽这两个方法;对于Abort来说,除了资源没有得到及时释放外,有时候会出现异常。如何做呢,通过设置开关变量来完成。  
对于问题二,我不建议使用静态成员来完成,仅仅为了线程而破坏类的封装有些得不偿失。那如何做呢,通过创建单独的线程类来完成。  
对于问题三来说,造成这个原因是由于线程中进行不间断的循环操作,从而使CPU完全被子线程占有。那么处理此类问题,其实很简单,在适当的位置调用Thread.Sleep(20)来释放所占有CPU资源,不要小看这20毫秒的睡眠,它的作用可是巨大的,可以使其他线程得到CPU资源,从而使你的CPU使用效率降下来。  
看完前面的三个问题的解释,对于如何做似乎没有给出一个明确的答案,为了更好地说明如何解决这三个问题,我用一个比较完整的例子展现给大家,代码如下。
//--------------------------- Sub-thread class ---------------------------------------
//------------------------------------------------
//---File:          clsSubThread
//---Description:   The sub-thread template class file  
//---Author:        Knight
//---Date:          Aug.21, 2006
//------------------------------------------------
//---------------------------{Sub-thread class}---------------------------------------
namespace ThreadTemplate
{
     using System;
     using System.Threading;
     using System.IO;
     /// <summary>
     /// Summary description for clsSubThread.
     /// </summary>
     public class clsSubThread:IDisposable
     {
         private Thread thdSubThread = null;
         private Mutex mUnique = new Mutex();  
         private bool blnIsStopped;
         private bool blnSuspended;
         private bool blnStarted;
         private int nStartNum;  
         public bool IsStopped
         {
             get{ return blnIsStopped; }
         }
         public bool IsSuspended
         {
             get{ return blnSuspended; }
         }
         public int ReturnValue
         {
             get{ return nStartNum;}
         }        
         public clsSubThread( int StartNum )
         {
             //
             // TODO: Add constructor logic here
             //
             blnIsStopped = true;
             blnSuspended = false;
             blnStarted = false;              
             nStartNum = StartNum;
         }  
         /// <summary>
         /// Start sub-thread
         /// </summary>
         public void Start()
         {
             if( !blnStarted )
             {
                 thdSubThread = new Thread( new ThreadStart( SubThread ) );
                 blnIsStopped = false;
                 blnStarted = true;
                 thdSubThread.Start();
             }
         }  
         /// <summary>
         /// Thread entry function
         /// </summary>
         private void SubThread()
         {