zoukankan      html  css  js  c++  java
  • 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();
            }
  • 相关阅读:
    Jquery的事件与动画-----下雨的天气好凉爽
    JQuery选择器--------没有它就没有页面效果
    JavaScript对象--------------你又知道那些
    实体类----app-config
    知错就改,善莫大焉!!!
    二分查找模板
    《软件工程》学习资料积累
    《计算机算法设计与分析》的学习资源和好的课程积累
    软件的概念
    递归方程的求解和算法时间复杂度的分析
  • 原文地址:https://www.cnblogs.com/HelloXZ/p/3384392.html
Copyright © 2011-2022 走看看