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();
            }
  • 相关阅读:
    ASP.NET Ajax – History Support
    Windows Server 2008 R2修改远程桌面连接数
    SQL中的行号ROW_NUMBER()
    数据库的缓存管理[ASPNET2.0深入挖掘系列听后感]
    html页面内容分页【转】
    内容页中操作MasterPage里的用户控件
    回车提交表单
    LightBox——一个不错的图片预览效果
    一个不错的日期控件
    三维地图[E都市]
  • 原文地址:https://www.cnblogs.com/HelloXZ/p/3384392.html
Copyright © 2011-2022 走看看