日期:2014-05-20  浏览次数:20983 次

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()

  {