CSDN第一期总结之三:Thread的问题

本文介绍了C#中多线程的常见问题,包括线程的基本操作、参数传递、CPU占用及子线程控制UI元素。通过示例代码展示了如何避免使用Thread的Suspend、Resume和Abort方法,提倡使用开关变量和Mutex实现线程的暂停、恢复和停止。同时,讨论了如何使用Invoke和BeginInvoke在子线程中安全地更新UI,强调了多线程与UI线程同步的重要性。
摘要由CSDN通过智能技术生成

C#是一门支持多线程的语言,因此线程的使用也是比较常见的。由于线程的知识在Win32编程的时候已经说得过多,所以在.Net中很少介绍这部分(可能.Net不觉得这部分是它所特有的)。

 

那么线程相关的问题大致有如下四类(这篇文章只讨论单线程、单线程与UI线程这两方面的问题)。

问题一,线程的基本操作,例如:暂停、继续、停止等;

问题二,如何向线程传递参数或者从中得到其返回值;

问题三,如何使线程所占用的CPU不要老是百分之百;

最后一个,也是问题最多的,就是如何在子线程来控制UI中的控件,换句话说,就是在线程中控制窗体某些控件的显示。

 

对于问题一,我不建议使用Thread类提供的SuspendResume以及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; }

评论 61
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值