这是代码,我在命令行应用程序中测试了snmpconn方法,但它在Windows窗体应用程序的运行时冻结了,我没有理由?
public snmpmain()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.button1.Click += new System.EventHandler(this.snmpconn);
}
private void button1_Click(object sender, EventArgs e)
{
//button1.Enabled = false; will disable the button before the event is fired
this.button1.Click += new System.EventHandler(this.snmpconn);
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
int port = 162;
// UdpClient listener;
// IPEndPoint groupEP;
byte[] packet = new byte[1024];
int commlength, miblength, datatype, datalength, datastart, Objecttype, Objectlength;
int agent;
int timestamp;
int entrspc;
int specifictrap;
int finallen;
int objectstart;
string objectid;
string test1;
byte[] test2 = new byte[1024];
int temp;
string tempo;
private void snmpconn(object sender, System.EventArgs e)
{
listBox1.Items.Add("Initializing" + port + "...");
this.button1.Click -= new System.EventHandler(this.snmpconn);
UdpClient listener = new UdpClient(port);
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, port);
while (true)
{
listBox1.Items.Add("Waiting....");
packet = listener.Receive(ref groupEP);
listBox1.Items.Add("Processing...");
if (packet.Length != 0)
{ // do some work
}
}
}
这适用于命令行应用程序。
你有线索吗?
答案 0 :(得分:4)
while (true)
如果你不确定你在做什么,请不要这样做,几乎从不这样做! 你站在那个循环中分配你的进程的100%资源,而不需要留下一点CPU来执行渲染。
你应该阅读&了解多线程和&尝试使代码正常工作之前的同步。
然后,你的btn点击过多的事件!
这一行:
this.button1.Click += new System.EventHandler(this.snmpconn);
button1_Click事件不需要。
此外,在点击时播放绑定事件可能会产生误导,您可以使用标志(true / false)来检查在单击btn时是否执行您的功能。