-12

コードは次のとおりです。コマンドライン アプリケーションで 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 
                  }
             }
         }

これは、コマンド ライン アプリケーションでうまく機能します。

手がかりはありますか。

4

1 に答える 1

4

うわー、主な間違いに気付かずに答えました!!

while (true)

自分が何をしているのかわからない場合は、ほとんど絶対にしないでください!! そのループに立っている間、レンダリングを実行するために CPU を 1 ビットも残さずに、プロセスの 100% のリソースを割り当てています。

コードを正常に動作させる前に、マルチスレッドと同期について読んで学習する必要があります。

次に、あまりにも多くのイベントを btn クリックにバインドしています!

この行:

   this.button1.Click += new System.EventHandler(this.snmpconn);

button1_Click イベントでは必要ありません。

また、クリック時にバインド イベントを操作すると誤解を招く可能性があります。フラグ (true/false) を使用して、btn がクリックされたときに関数を実行するかどうかを確認できます。

于 2013-07-05T15:34:31.027 に答える