解决Thread 的关闭问题
 1 public class BX_Thread
public class BX_Thread
2 {
    {
3 private Thread thWorker;
        private Thread thWorker;
4 private bool IsClosing =false;
        private bool IsClosing =false;
5
6 private int Interval =0;
        private int Interval =0;
7 private object objParameter;
        private object objParameter;
8 public BX_Thread(object Parameter)
        public BX_Thread(object Parameter)
9 {
        {
10 this.objParameter =Parameter;
            this.objParameter =Parameter;
11 this.thWorker =new Thread(new ThreadStart(WorkProc));
            this.thWorker =new Thread(new ThreadStart(WorkProc));
12 this.thWorker.Priority =ThreadPriority.Lowest;
            this.thWorker.Priority =ThreadPriority.Lowest;
13 }
        }
14
15 public void Run(int Interval)
        public void Run(int Interval)
16 {
        {
17 this.thWorker.Start();
            this.thWorker.Start();
18 }
        }
19
20 private void WorkProc()
        private void WorkProc()
21 {
        {
22 while(this.IsClosing !=true)
            while(this.IsClosing !=true)
23 {
            {
24 if(this.Interval !=0)
                if(this.Interval !=0)
25 {
                {
26 Thread.Sleep(this.Interval);
                    Thread.Sleep(this.Interval);
27 }
                }
28 //do something
                //do something
29 
                                
30 }
            }
31
32 this.thWorker =null;
            this.thWorker =null;
33 }
        }
34
35 public void Close()
        public void Close()
36 {
        {
37 this.IsClosing =true;
            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正常结束。
而且用错了结束的方式,也会很麻烦。
 public class BX_Thread
public class BX_Thread2
 {
    {3
 private Thread thWorker;
        private Thread thWorker;4
 private bool IsClosing =false;
        private bool IsClosing =false;5

6
 private int Interval =0;
        private int Interval =0;7
 private object objParameter;
        private object objParameter;8
 public BX_Thread(object Parameter)
        public BX_Thread(object Parameter)9
 {
        {10
 this.objParameter =Parameter;
            this.objParameter =Parameter;11
 this.thWorker =new Thread(new ThreadStart(WorkProc));
            this.thWorker =new Thread(new ThreadStart(WorkProc));12
 this.thWorker.Priority =ThreadPriority.Lowest;
            this.thWorker.Priority =ThreadPriority.Lowest;13
 }
        }14

15
 public void Run(int Interval)
        public void Run(int Interval)16
 {
        {17
 this.thWorker.Start();
            this.thWorker.Start();18
 }
        }19

20
 private void WorkProc()
        private void WorkProc()21
 {
        {22
 while(this.IsClosing !=true)
            while(this.IsClosing !=true)23
 {
            {24
 if(this.Interval !=0)
                if(this.Interval !=0)25
 {
                {26
 Thread.Sleep(this.Interval);
                    Thread.Sleep(this.Interval);27
 }
                }28
 //do something
                //do something29
 
                                30
 }
            }31

32
 this.thWorker =null;
            this.thWorker =null;33
 }
        }34

35
 public void Close()
        public void Close()36
 {
        {37
 this.IsClosing =true;
            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正常结束。
而且用错了结束的方式,也会很麻烦。
    -----------------------------------------------------------------
 
                    
                
 
 
     
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号