net 线程挂起

2013、10、18  通讯组件开发

 

情景:
主线程添加队列,子线程负责队列中消息发送。当队列中数据为空时,停止发送挂起子线程。
当主线程添加队列时,重新开启子线程进行消息发送。
方案一 但是不采用
传统Thread线程方式:首先方法过期thread.Suspend();暂不采用
。其次主子线程同时控制挂起和重启时候,可能会造成遗漏。
例如 子线程正在挂起,主线程网队列中添加一条数据时。子线程挂起,但是主线程刚添加的消息没有被及时发送出去
这样的话虽然可以在下次添加时启用子线程进行发送。但是刚才添加的数据没有被及时发送。因为涉及导数据的及时性因此不采用此种方式。
而且会收到线程状态瞬间切换问题操作重启线程无效

方案二 ResetEvent
ResetEvent 这个函数把指定的事件对象设置为无信号状态。当重新获得信号时才会继续开启发送

这样的话 在子线程中监视到队列为空时则停止队列发送。
同时每次添加新的队列信息是,都会发送开启子线程信息号。并且不受到线程的状态影响。
因此可以保证队列数据的及时性。
参照代码
  ManualResetEvent manualEvent = new ManualResetEvent(false);
        private void Form1_Load(object sender, EventArgs e)
        {
// 开启线程
            Thread th = new Thread(Test);
            th.Start();
        }
        int c = 0;
        public void Test()
        {
            while (true)
            {
                c++;
                Console.WriteLine(c);
                if (c == 10000)
                {
                    manualEvent.WaitOne();
  manualEvent.Reset();
                }
            }
        }
        // 发送叫起信号
        private void button1_Click(object sender, EventArgs e)
        {
            manualEvent.Set();
        }
原文地址:https://www.cnblogs.com/HelloXZ/p/3384392.html