C#APP在运行时冻结

时间:2013-07-05 15:31:53

标签: c# .net winforms

这是代码,我在命令行应用程序中测试了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 
                  }
             }
         }

这适用于命令行应用程序。

你有线索吗?

1 个答案:

答案 0 :(得分:4)

哇,我回答时没有注意到主要的错误!

while (true)

如果你不确定你在做什么,请不要这样做,几乎从不这样做! 你站在那个循环中分配你的进程的100%资源,而不需要留下一点CPU来执行渲染。

你应该阅读&了解多线程和&尝试使代码正常工作之前的同步。

然后,你的btn点击过多的事件!

这一行:

   this.button1.Click += new System.EventHandler(this.snmpconn);
button1_Click事件不需要

此外,在点击时播放绑定事件可能会产生误导,您可以使用标志(true / false)来检查在单击btn时是否执行您的功能。