解决Thread 的关闭问题

it2022-05-09  29

 1 public   class  BX_Thread  2      { 3        private Thread thWorker; 4        private bool IsClosing =false; 5 6        private int Interval =0; 7        private object objParameter; 8        public BX_Thread(object Parameter) 9        {10            this.objParameter =Parameter;11            this.thWorker =new Thread(new ThreadStart(WorkProc));12            this.thWorker.Priority =ThreadPriority.Lowest;13        }1415        public void Run(int Interval)16        {17            this.thWorker.Start();18        }1920        private void WorkProc()21        {22            while(this.IsClosing !=true)23            {24                if(this.Interval !=0)25                {26                    Thread.Sleep(this.Interval);27                }28                //do something29                                30            }3132            this.thWorker =null;33        }3435        public void Close()36        {37            this.IsClosing =true;38        }39    }这是一种非Abort的结束方式. 这里有个while循环.需要解释一下.一般来说,多线程运用到生产消费模式的情况比较多.最典型的:我在一个线程中将数据不断的填入一个队列.然后开很多线程不断的重队列中取出数据进行处理.这是,线程的执行方法通常是考虑如下的结构:WorkProc(){    while(true)     {        if(队列中有数据)        {            取出一个进行处理。        }    }}BX_Thread模型主要对这个模型的循环部分进行了修改。WorkProc(){    while(this.IsClosing !=true)    {        if(队列中有数据)        {            取出一个进行处理。        }    }}然后提供一个方法:BX_Thread.Close()只需要将 private bool IsClosing 改为true.线程就会自己退出循环了。一但退出循环,线程也就自然死亡而非谋杀了。所以这个是一种思路。BX_Thread可以这样使用:首先改写WorkProc()满足你的需求。BX_Thread thWorker =new BX_Thread( Parameter);thWorker.Run(1000);//这里的1000回导致循环一次Sleep1秒。如果Run(0)则不Sleep..//结束thWorker.Close();如果不想改写WorkProc那么可以考虑做一个接口。将线程和业务分离。我的意思,还有一点:并不是说Abort没有存在的价值。有时也会有Abort起来很方便的时候。但是大多数情况,需要Thread正常结束。而且用错了结束的方式,也会很麻烦。

转载于:https://www.cnblogs.com/tuyile006/archive/2006/06/26/436133.html


最新回复(0)