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 description for clsSubThread. /// 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 = fals
e; blnStarted = false; nStartNum = StartNum; } ///
/// Start sub-thread /// public void Start() { if( !blnStarted ) { thdSubThread = new Thread( new ThreadStart( SubThread ) ); blnIsStopped = false; blnStarted = true; thdSubThread.Start();
} } ///
/// Thread entry function /// private void SubThread() { do { // Wait for resume-command if got suspend-command here mUnique.WaitOne(); mUnique.ReleaseMutex(); nStartNum++; Thread.Sleep(1000); // 这里暂停,让其它线程能有时间处理自己的事情, //降低 CPU 利用率 }while( blnIsStopped == false ); } ///
/// Suspend sub-thread /// public void Suspend() { if( blnStarted &;&; !blnSuspended ) { blnSuspended = true; mUnique.WaitOne(); } } ///
/// Resume sub-thread /// public void Resume() { if( blnStarted &a