• 解决Thread 的关闭问题


     1public 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        }

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

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

    28                //do something
    29                                
    30            }

    31
    32            this.thWorker =null;
    33        }

    34
    35        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正常结束。
    而且用错了结束的方式,也会很麻烦。
  • 相关阅读:
    android界面基本属性
    iOS请求webservice
    图片在鼠标经过时变大
    控制字体大小,em与px的区别与应用
    IE的另类CSS hack,条件注释
    几种流行的AJAX框架jQuery,Mootools,Dojo,Ext JS的对比
    CSS实现文字压在边线上的效果,fieldset与legend
    每个.NET 开发人员应该下载的十个必备工具
    css做出丰富的Tooltips
    .NET牛人应该知道些什么?
  • 原文地址:https://www.cnblogs.com/tuyile006/p/436133.html
Copyright © 2020-2023  润新知