写了一个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);
}
}
}
主要代码如下,但是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);
}
}
}
{
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); 你的线程需要休息下..
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); 激发有点草率.
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%负荷的循环执行,循环出错。