mp;;&; blnSuspended ) { blnSuspended = false; mUnique.ReleaseMutex(); } }
///
/// Stop sub-thread /// public void Stop() { if( blnStarted ) { if( blnSuspended ) Resume(); blnStarted = false; blnIsStopped = true; thdSubThread.Join(); } } #region IDisposable Members ///
/// Class resources dispose here /// public void Dispose() { // TODO: Add clsSubThread.Dispose implementation Stop();//Stop thread first GC.SuppressFinalize( this ); } #endregion } } 那么对于调用呢,就非常简单了,如下: // Create new sub-thread object with parameters clsSubThread mySubThread = new clsSubThread( 5 ); mySubThread.Start();//Start thread Thread.Sleep( 2000 ); mySubThread.Suspend();//Suspend thread Thread.Sleep( 2000 ); mySubThread.Resume();//Resume thread Thread.Sleep( 2000 ); mySubThread.Stop();//Stop thread //Get thread's return value Debug.WriteLine( mySubThread.ReturnValue );
//Release sub-thread object mySubThread.Dispose(); 在回过头来看看前面所说的三个问题。 对于问题一来说,首先需要局部成员的支持,那么 private Mutex mUnique = new Mutex(); private bool blnIsStopped; private bool blnSuspended; private bool blnStarted; 光看成员名称,估计大家都已经猜出其代表的意思。接下来需要修改线程入口函数,要是这 些开关变量能发挥作用,那么看看 SubThread 这个函数。 ///
/// Thread entry function /// private void SubThread() { do { // Wait for resume-command if got suspend-command here mUnique.WaitOne(); mUnique.ReleaseMutex(); nStartNum++; Thread.Sleep(1000); }while( blnIsStopped == false ); } 函数比较简单,不到十句,可能对于“blnIsStopped == false”这个判断来说,大家还比较好 理解,这是一个普通的判断,如果当前 Stop 开关打开了,就停止循环;否则一直循环。 大家比较迷惑的可能是如下这两句: mUnique.WaitOne(); mUnique.ReleaseMutex(); 这两句的目的是为了使线程在 Suspend 操作的时候能发挥效果,为了解释这两句,需要结合 Suspend 和 Resume 这两个方法,它
俩的代码如下。 ///
/// Suspend sub-thread /// public void Suspend() { if( blnStarted &;&; !blnSuspended ) {
blnSuspended = true; mUnique.WaitOne(); } } ///
/// Resume sub-thread /// public void Resume() { if( blnStarted &;&; blnSuspended ) { blnSuspended = false; mUnique.ReleaseMutex(); } } 为了更好地说明,还需要先简单说说 Mutex 类型。对于此类型对象,当调用对象的 WaitOne 之后,如果此时没有其他线程对它使用的时候,就立刻获得信号量,继续执行代码;当再调 用 ReleaseMutex 之前,如果再调用对象的 WaitOne 方法,就会一直等待,直到获得信号量 的调用 ReleaseMutex 来进行释放。这就好比卫生间的使用,如果没有人使用则可以直接使 用,否则只有等待。 明白了这一点后,再来解释这两句所能出现的现象。 mUnique.WaitOne(); mUnique.ReleaseMutex(); 当在线程函数中,执行到“mUnique.WaitOne();”这一句的时候,如果此时外界没有发送 Suspend 消息,也就是信号量没有被占用,那么这一句可以立刻返回。那么为什么要紧接着 释放呢,因为不能总占着信号量,立即释放信号量是避免在发送 Suspend 命令的时候出现等 待 ; 如 果 此 时 外 界 已 经 发 送 了 Suspend 消 息 , 也 就 是 说 信 号 量 已 经 被 占 用 , 此 时 “mUnique.WaitOne();”不能立刻返回,需要等到信号量被释放才能继续进行,也就是需要 调用 Resume 的时候, “mUnique.WaitOne();”才能获得信号量进行继续执行。这样才能达到 真正意义上的 Suspend 和 Resume。 至于线程的 Start 和 Stop 来说,相对比较简单,这里