首先说明下,我的窗体上面只有一个ListBox控件,改名为lsvUsers
其次,我要实现的功能就是一运行软件,就向局域网中的用户发送一个数据包,告诉他们我上线了。然后他们都回馈一个数据包给我,我好把他们添加到我的列表中,功能已经实现,但是为什么cpu占用率居高不下呢?
一下是我的代码: public bool running = false;//标志
public UdpClient listen = new UdpClient(2525);
public IPEndPoint End;
public IPAddress groupAddress = IPAddress.Parse("255.255.255.255");//广播地址
public int groupPort = 2525;//广播端口
public IPAddress myIP; //本机ip地址
public string myName; //本机名称
public string _data; private void mainFrm_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
End = new IPEndPoint(groupAddress,groupPort);
//初始化计算机名称和端口号
IPHostEntry myentry = Dns.GetHostEntry(Dns.GetHostName());
myIP =new IPAddress(myentry.AddressList[0].Address); //得到本机的ip地址
myName = Dns.GetHostName(); //得到本机名称
lsvUsers.Items.Add("IP 主机名"); //开启监听线程
running = true;
Thread t = new Thread(new ThreadStart(ListenPort));
t.IsBackground = false;
t.Start(); //发送上线信息
_data="0x01"+"|"+myIP.ToString()+"|"+myName.ToString();
byte[] data = Encoding.Default.GetBytes(_data);
SendPack(data);
} //发送广播数据包
private void SendPack(byte[] data)
{
try
{
listen.Send(data, data.Length, End);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void ListenPort()
{
IPEndPoint tempEnd = new IPEndPoint(IPAddress.Any,2525);
while (running)
{
Application.DoEvents();
try
{
byte[] recv = listen.Receive(ref tempEnd);
//检查收到的信息并进行处理
string recvStr = Encoding.Default.GetString(recv);
string[] _recvStr = recvStr.Split('|');
//for (int i = 0; i < _recvStr.Length; i++)
//{
// MessageBox.Show(_recvStr[i].ToString());
//}
switch (_recvStr[0])
{
case "0x01":
_data = "0x01" + "|" + myIP.ToString() + "|" + myName.ToString();
byte[] data = Encoding.Default.GetBytes(_data);
SendPack(data);
if (lsvUsers.FindString(_recvStr[1] + " " + _recvStr[2]) <= 0)
{
lsvUsers.Items.Add(_recvStr[1] + " " + _recvStr[2]);
}
break;
}
}
catch(Exception ex)
{
MessageBox.Show("出现错误:"+ex.Message.ToString());
break;
}
}
}
其次,我要实现的功能就是一运行软件,就向局域网中的用户发送一个数据包,告诉他们我上线了。然后他们都回馈一个数据包给我,我好把他们添加到我的列表中,功能已经实现,但是为什么cpu占用率居高不下呢?
一下是我的代码: public bool running = false;//标志
public UdpClient listen = new UdpClient(2525);
public IPEndPoint End;
public IPAddress groupAddress = IPAddress.Parse("255.255.255.255");//广播地址
public int groupPort = 2525;//广播端口
public IPAddress myIP; //本机ip地址
public string myName; //本机名称
public string _data; private void mainFrm_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
End = new IPEndPoint(groupAddress,groupPort);
//初始化计算机名称和端口号
IPHostEntry myentry = Dns.GetHostEntry(Dns.GetHostName());
myIP =new IPAddress(myentry.AddressList[0].Address); //得到本机的ip地址
myName = Dns.GetHostName(); //得到本机名称
lsvUsers.Items.Add("IP 主机名"); //开启监听线程
running = true;
Thread t = new Thread(new ThreadStart(ListenPort));
t.IsBackground = false;
t.Start(); //发送上线信息
_data="0x01"+"|"+myIP.ToString()+"|"+myName.ToString();
byte[] data = Encoding.Default.GetBytes(_data);
SendPack(data);
} //发送广播数据包
private void SendPack(byte[] data)
{
try
{
listen.Send(data, data.Length, End);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void ListenPort()
{
IPEndPoint tempEnd = new IPEndPoint(IPAddress.Any,2525);
while (running)
{
Application.DoEvents();
try
{
byte[] recv = listen.Receive(ref tempEnd);
//检查收到的信息并进行处理
string recvStr = Encoding.Default.GetString(recv);
string[] _recvStr = recvStr.Split('|');
//for (int i = 0; i < _recvStr.Length; i++)
//{
// MessageBox.Show(_recvStr[i].ToString());
//}
switch (_recvStr[0])
{
case "0x01":
_data = "0x01" + "|" + myIP.ToString() + "|" + myName.ToString();
byte[] data = Encoding.Default.GetBytes(_data);
SendPack(data);
if (lsvUsers.FindString(_recvStr[1] + " " + _recvStr[2]) <= 0)
{
lsvUsers.Items.Add(_recvStr[1] + " " + _recvStr[2]);
}
break;
}
}
catch(Exception ex)
{
MessageBox.Show("出现错误:"+ex.Message.ToString());
break;
}
}
}
你这里的代码导致的占用CPU居高不下~虽然是子线程
建议使用BeginXXXX一类的异步方式
严重同意。如果项目小的话楼主可以试试BackgroundWorker这个控件。