写了一个udpsocket 类,主是设置了一个事件,定义了一个委托,
主要代码如下,但是cpu占用很高,怎么才能减少cpu资源的消耗??求一个好方法,
public delegate void DataArrivalEventHandler(byte[] Data);
        //定义一事件做数据处理
        
 public event DataArrivalEventHandler UdpDataArrival;
  protected void Listener()//监听方法
        {
            
            if (m_UdpServer != null)
            {
                m_UdpServer.Close();
            }
            
            try
            {
                m_UdpThred = new Thread(new ThreadStart(GetUDPData));
                m_UdpThred.Start();
            }
            catch(Exception e)
            {
                MessageBox.Show(e.Message.ToString());
            }
        }private void GetUDPData()
        {
            while (m_active)
            {
                try 
                {
                    IPEndPoint remote = null;
                    byte[] data = m_UdpServer.Receive(ref remote);
                    UdpDataArrival(data); 
                    
                }catch(Exception e)
                {
                    //MessageBox.Show(e.Message);
                }
            }
        }

解决方案 »

  1.   

     while (m_active) 
                { 
                    try 
                    { 
                        IPEndPoint remote = null; 
                        byte[] data = m_UdpServer.Receive(ref remote); 
                        UdpDataArrival(data); 
                        
                    }
                    catch(Exception e) 
                    { 
                        //MessageBox.Show(e.Message); 
                    } 
                } 
    加 System.Threading.Thread.Sleep(100); 你的线程需要休息下..
      

  2.   

    线程休息了,会掉udp包吧??
      

  3.   

    UdpDataArrival中做了些什么?如果要做复杂的数据处理,占用CPU资源较多是正常的。
      

  4.   

    对是数据处理分析,该存数据库的存数据库,该返回udp包的返回个包,挺浪费时间的,本来想异常处理的,发现写个委托后就不用了,
      

  5.   


                while (m_active)
                {
                    try
                    {
                        IPEndPoint remote = null;
                        byte[] data = m_UdpServer.Receive(ref remote);
                        UdpDataArrival(data);
                       
                    }catch(Exception e)
                    {
                        //MessageBox.Show(e.Message);
                    }
                }
    上面这段代码运行在独立线程中,
    有个问题需要考虑下: 
    对于 UdpDataArrival 事件的激发, 也就是委托实现所在的函数是否需要 marshal 调用.问题本质:
    UdpDataArrival 所在函数应该运行在哪个线程上.如果需要运行在 UI 线程上, 直接 UdpDataArrival(data); 激发有点草率.
      

  6.   

    仔细看下楼主你那个监听的方法,明显有问题啊:
      protected void Listener()//监听方法 
            { 
                
                if (m_UdpServer != null) //如果UdpClient实例化了
                { 
                    m_UdpServer.Close(); //将UdpClient关闭
                } 
                
                try 
                { 
                    m_UdpThred = new Thread(new ThreadStart(GetUDPData)); //使用关闭的UdpClient创建新的线程。
                    m_UdpThred.Start(); 
                } 
                catch(Exception e) 
                { 
                    MessageBox.Show(e.Message.ToString()); 
                } 
            } 
    我加了点注释,楼主你看出来了吗?这样的线程肯定是要报错的.
    我刚才模拟了下,不报错的情况下,UdpClient会在Receive方法阻塞,直到收到数据,此时CPU使用率为0%,但是你先关闭了UdpClient,结果导致执行到那里出错,而错误信息直接被try-catch捕获,不反映出来,外加错误后你也没有跳出循环,所以就CPU100%负荷的循环执行,循环出错。