• 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();
            }
  • 相关阅读:
    Git 分支管理
    Kubernetes 中文文档
    Docker 命令大全
    Redis 常用命令 大全
    Docker 资源汇总
    Docker 安装 Redis
    JavaScript闭包
    CSS选择器
    JavaScript类型转换
    javascript字符串处理方法
  • 原文地址:https://www.cnblogs.com/HelloXZ/p/3384392.html
Copyright © 2020-2023  润新知