以前常常需要用多线程做一些耗时的工作,同时,为了降低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()进行等待了
}
}
}
看来,编程的时候,对《操作系统原理》上的基础理论要认真学习,不能想当然就采用类库中提供的方法。