让线程中止的改良办法

    以前常常需要用多线程做一些耗时的工作,同时,为了降低CPU的占用率,在线程中常常会用Thread.Sleep()让线程进入睡眠。
    以前的多线程处理一般是这样的:
public class Work
{
    private bool m_blnIsRunning = false;
    private Thread m_tWork;

    public void Start()
    {
        lock (this)
        {
            if (m_blnIsRunning)
            {
                return;
            }
            m_blnIsRunning = true;
        }
        m_tWork = new Thread(new ThreadStart(_Work_t));
        m_tWork.Start();
    }

    public void Stop()
    {
        lock (this)
        {
            if (!m_blnIsRunning)
            {
                return;
            }
            m_blnIsRunning = false;
        }
        m_tWork.Join();  //如果希望马上退出,则为m_tWork.Abort();
        m_tWork = null;
    }

    private void _Work_t()
    {
        while (m_blnIsRunning)
        {
            //Do something
            Thread.Sleep(1000);
        }
    }
}

    可见这里采用的方法非常野蛮,想中止线程的时候,要吗Stop()方法要等待和线程睡眠一样的时间,要吗强行强行中断。通过采用Event,能够大大改良这样的设计。
    以下是使用AutoResetEvent后的代码:
public class Work
{
    private AutoResetEvent m_oEvent = new AutoResetEvent(false);
    private bool m_blnIsRunning = false;
    private Thread m_tWork;

    public void Start()
    {
        lock (this)
        {
            if (m_blnIsRunning)
            {
                return;
            }
            m_blnIsRunning = true;
        }
        m_oEvent.Reset();
        m_tWork = new Thread(new ThreadStart(_Work_t));
        m_tWork.Start();
    }

    public void Stop()
    {
        lock (this)
        {
            if (!m_blnIsRunning)
            {
                return;
            }
            m_blnIsRunning = false;
        }
        m_oEvent.Set();  //通知事件马上结束
        m_tWork.Join();
        m_tWork = null;
    }

    private void _Work_t()
    {
        while (m_blnIsRunning)
        {
            //Do something
            m_oEvent.WaitOne(1000, false);  //不再使用Thread.Sleep()进行等待了
        }
    }
}

    看来,编程的时候,对《操作系统原理》上的基础理论要认真学习,不能想当然就采用类库中提供的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值