2013-07-05 6 views
-11

코드가 있습니다. 명령 행 응용 프로그램에서 snmpconn 메서드를 테스트했지만 작동하는 동안 Windows 응용 프로그램에서 런타임에 멈 춥니 다. 그 이유는 무엇입니까?런타임 중에 C# APP가 동결됩니다.

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

참고하시기 바랍니다. http://stackoverflow.com/help/dont-ask – Liam

+2

죄송하지만, 코드를 디버깅하지 않으 셨습니다. – Liam

+0

이것은 특정 포럼에 오류 메시지, 스택 추적 등을 줄 수있는 경우 http://meta.stackexchange.com/questions/92107/is-stack-overflow-a-forum/92110#92110 – Liam

답변

4

와아, 나는 주된 실수를 알아 채지 않고 대답했다!

while (true) 

당신이하고있는 일을 잘 모르는 경우, 거의하지 마십시오! 렌더링을 수행하기 위해 CPU의 단일 비트를 남기지 않고 해당 루프에 서서 프로세스의 100 % 리소스를 할당합니다.

코드가 올바르게 작동하기 전에 & 멀티 스레드 스레딩 &에 대해 알아야합니다.

그러면 Btn 클릭에 너무 많은 이벤트가 바인딩됩니다.

이 행 :

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

는 button1_Click 이벤트에 필요하지 않습니다.

또한 클릭 할 때 바인딩 이벤트로 재생하는 것은 잘못된 것일 수 있습니다. btn을 클릭 할 때 기능을 수행할지 여부를 확인하기 위해 플래그 (true/false)를 사용할 수 있습니다.

+0

'while (true)'가 나쁘게 만든다면 여전히 문제가 걸려있다. – user726720

+0

커맨드 라인에서 왜 작동 했는가? – matzone

+0

확실히 while 루프가 아닙니다. 제거한 후에도 여전히 중단됩니다. – user726720

관련 문제