解决Thread 的关闭问题

 1 None.gif public   class  BX_Thread
 2 ExpandedBlockStart.gifContractedBlock.gif     {
 3InBlock.gif        private Thread thWorker;
 4InBlock.gif        private bool IsClosing =false;
 5InBlock.gif
 6InBlock.gif        private int Interval =0;
 7InBlock.gif        private object objParameter;
 8InBlock.gif        public BX_Thread(object Parameter)
 9ExpandedSubBlockStart.gifContractedSubBlock.gif        {
10InBlock.gif            this.objParameter =Parameter;
11InBlock.gif            this.thWorker =new Thread(new ThreadStart(WorkProc));
12InBlock.gif            this.thWorker.Priority =ThreadPriority.Lowest;
13ExpandedSubBlockEnd.gif        }

14InBlock.gif
15InBlock.gif        public void Run(int Interval)
16ExpandedSubBlockStart.gifContractedSubBlock.gif        {
17InBlock.gif            this.thWorker.Start();
18ExpandedSubBlockEnd.gif        }

19InBlock.gif
20InBlock.gif        private void WorkProc()
21ExpandedSubBlockStart.gifContractedSubBlock.gif        {
22InBlock.gif            while(this.IsClosing !=true)
23ExpandedSubBlockStart.gifContractedSubBlock.gif            {
24InBlock.gif                if(this.Interval !=0)
25ExpandedSubBlockStart.gifContractedSubBlock.gif                {
26InBlock.gif                    Thread.Sleep(this.Interval);
27ExpandedSubBlockEnd.gif                }

28InBlock.gif                //do something
29InBlock.gif                                
30ExpandedSubBlockEnd.gif            }

31InBlock.gif
32InBlock.gif            this.thWorker =null;
33ExpandedSubBlockEnd.gif        }

34InBlock.gif
35InBlock.gif        public void Close()
36ExpandedSubBlockStart.gifContractedSubBlock.gif        {
37InBlock.gif            this.IsClosing =true;
38ExpandedSubBlockEnd.gif        }

39ExpandedBlockEnd.gif    }



这是一种非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正常结束。
而且用错了结束的方式,也会很麻烦。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值