using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace ThreadDemo
{
    public class ThreadProxy : IDisposable
    {
        private int _threadCount = 1;
        ExpressCollection _list;
        private Thread[] _threads = null;
        private bool _isRun = false;
        private bool _hasDataToHandle;        public ThreadProxy(ExpressCollection list)
        {
            _list = list;
        }        public bool HasDataToHandle
        {
            get
            {
                return _hasDataToHandle;
            }
            set
            {
                if (value)//如果设置为true时就监测当前线程是否挂起
                {
                    if (this != null)//这里怎样才能获得当前线程数组的引用呢?this不行呢?
                    {
                        if (.ThreadState == System.Threading.ThreadState.Suspended)
                        //如果当前线程已经挂起,就启动当前线程
                        {
                            Thread.Resume();
                        }
                    }
                }                _hasDataToHandle = value;
            }
        }
        public ThreadProxy(int threadCount, ExpressCollection list)
            : this(list)
        {
            _threadCount = threadCount;
            _threads = new Thread[_threadCount];
        }        public void Run(bool Re)
        {
            if (Re) _isRun = false;            if (!_isRun && _list != null && _list.Count>0)
            {
                _isRun = true;
                for (int i = 0; i < _threadCount; i++)
                {
                    _threads[i] = new Thread(new ThreadStart(ThreadInvoke));
                    _threads[i].IsBackground = true;
                    _threads[i].Start();
                }
            }
        }        public void Stop()
        {
            _isRun = false;
        }        private void ThreadInvoke()
        {
            try
            {
                while (_isRun)
                {
                    Express express = _list.GetNext();
                    if (express != null)
                    {
                        int result = express.A + express.B;
                        OnExpressComputed(result, express);
                        Thread.Sleep(100);//测试暂停
                        _hasDataToHandle = false;
                        if (!_hasDataToHandle)//这个在while循环的最下层
                        {
                            sThread.Suspend(); //如果当前没有任务做就挂起当前线程
                        }
                    }
                    else
                    {
                        break;
                    }
                    //else
                    //{
                    //    Thread.Sleep(1000);
                    //}
                }
            }
            catch (ThreadAbortException)
            {
                Thread.ResetAbort();
                return;
            }
            catch (Exception)
            {
                //记录日志
            }
        }        public event EventHandler<ExpressComputedEventArgs> ExpressComputed;        protected virtual void OnExpressComputed(int result ,Express express)
        {
            if (ExpressComputed != null)
            {
                ExpressComputed(this, new ExpressComputedEventArgs(result,express));
            }
        }        #region IDisposable 成员        public void Dispose()
        {
            _isRun = false;
            if (_threads != null)
            {
                _threads = null;
            }
        }        #endregion
    }    public class ExpressComputedEventArgs : EventArgs
    {
        private int result;        public int Result
        {
            get { return result; }
            set { result = value; }
        }        public ExpressComputedEventArgs(int result , Express express)
        {
            this.result = result;
            this.express = express;
        }        private Express express;        public Express Express
        {
            get { return express; }
            set { express = value; }
        }
    }
}