2009-09-16 3 views
0

프로그래밍을 처음 사용하기 때문에 SendAsync 메서드로 시작된 스레드를 디버깅하기 위해 검색 대상을 찾거나 찾을 수 없습니다. 코드는 Send Method를 사용하여 잘 작동하지만 SendAsync를 사용하면 waiter.WaitOne()으로 이동하지만 myPing_PingCompleted에 콜백을받지 않습니다. 그래서 두 가지 질문은 새로운 스레드를 시작할 때 코드를 디버깅하는 방법입니다. 내가 VS로 모든 디버깅 도구를 가지고 있지 않을 수도 있습니다 C# Express를 사용하고 있습니다. 그리고 내가 코드에서 잘못 가고있는 어떤 생각이든. 감사Ping 클래스 SendAsync 도움말

using System; 
using System.CodeDom; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Diagnostics; 
using System.Net.NetworkInformation; 
using System.Threading; 
using System.Net; 

private void btnPingAsync_Click(object sender, EventArgs e) 
    { 
     string bIP = txtStartIP.Text; 
     string eIP = txtEndIP.Text; 
     int timeOut; 
     int cnt = 0; 
     if (eIP == null) eIP = bIP; 
     Ping myPing = new Ping(); 
     PingOptions parmPing = new PingOptions(); 
     AutoResetEvent waiter = new AutoResetEvent(false); 
     myPing.PingCompleted +=new PingCompletedEventHandler(myPing_PingCompleted); 
     string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 
     byte[] dataBuffer = Encoding.ASCII.GetBytes(data); 
     if (!int.TryParse(txtTimeOut.Text, out timeOut)) timeOut = 120; 
     parmPing.DontFragment = true; 
     parmPing.Ttl = 32; 
     pbQueueStatus.Minimum = 0; 
     pbQueueStatus.Step = 10; 
     pbQueueStatus.Value = 0; 
     pbQueueStatus.Style = ProgressBarStyle.Continuous; 




     if (verify.ValidIPAddress(bIP) && verify.ValidIPAddress(eIP)) 
     { 
      IPQueue = build.IPAddressQueue(bIP, eIP); 
      pbQueueStatus.Maximum = IPQueue.Count; 
      pbQueueStatus.TopLevelControl.UseWaitCursor= true; 
      pbQueueStatus.Visible = true; 
      while (IPQueue.Count > 0) 
      { 
       myPing.SendAsync(IPQueue.Dequeue(), timeOut, dataBuffer, parmPing, waiter); 
       waiter.WaitOne(); 
       if (++cnt > 10) 
       { 
        pbQueueStatus.PerformStep(); 
        cnt = 0; 
       } 
      } 
     } 
    } 

    private void myPing_PingCompleted(Object sender, PingCompletedEventArgs e) 
    { 

     PingReply reply = e.Reply; 
     ((AutoResetEvent)e.UserState).Set(); 
     if (reply .Status == IPStatus .Success) 
     { 
      dosomething; 
     } 
+0

이상한, 나는 또한 실패한 온라인 도움말에서 예제를 복사했습니다. http://msdn.microsoft.com/en-us/library/ms144962.aspx –

+0

Ping 클래스에 대한 msdn 온라인 도움말은 무엇입니까? 내 가이드로 사용했습니다. – DicksGarage

답변

0

난 당신이 myPing_PingCompleted 방법에 breakpoinit를 가하고 있다고하지만 디버그 모드에서의 그냥하지 않을 경우 있으리라 믿고있어. 그게 맞습니까?

코드가 일종의 오류를 던지고 있습니까? 코드를 단계별로 실행하면 올바른 매개 변수가있는 myPing.SendAsync가 호출됩니까?

IPQueue없이 사용자 지정 클래스처럼 보였습니다. 그것은 내 말 잘 작동합니다. 하나의 유효한 IP와 존재하지 않는 IP를 사용했습니다. 두 경우 모두 잘 작동했습니다. 새로운 정보에 대한

편집

좋아 난 그냥 윈도우 폼 응용 프로그램에서 시도하고 작동하지 않습니다. 내가 그것을 시험해보기 전에 그것이 단위 테스트에 있었다. 기본적으로 Windows 폼을 렌더링하고 이벤트를 처리하는 데 사용되는 스레드는 비동기 요청을 생성하는 데 사용할 수 없습니다 (아마도 전경 스레드이기 때문에). 그러나 ping을 수행 할 다른 스레드를 만들어 arround를 쉽게 얻을 수 있습니다.

사실, 어쨌든 그렇게하는 것이 이상적입니다. 스레드가 사용 중일 때 창 양식 앱이 잠기지 않도록하려면 별도의 스레드에서 모든 backround 작업을 수행하는 것이 좋습니다. 이렇게하면 창을 반응 적으로 유지할 수 있습니다. 주의 할 것은, backround 쓰레드를 사용하여 컨트롤에 접근하려고 할 때 예외가 발생한다는 것입니다. 개인 변수에 필요한 모든 값을 읽고 모든 작업을 수행 할 스레드를 걷어 내고 스레드가 다른 변수 집합을 업데이트 한 다음 forground 스레드가 변수를 읽고 컨트롤을 업데이트하게하는 것이 가장 좋습니다.

+0

예 myPing_Ping Completed 메서드의 첫 번째 문에 중단 점이 있습니다. 프로그램을 단계별로 실행할 때 마지막 실행 문은 waiter.WaitOne() 메서드입니다.이 양식은 다시 실행되지만 완전히 다시 그려지지 않고 아무것도 반환되지 않습니다. 이 문제는 두 대의 컴퓨터에서 발생합니다. 참조가 누락 될 수 있습니까? 질문에있는 코드 샘플에 대한 참조를 추가했습니다. – DicksGarage

+0

또한 IPQueue 대신 IP 주소를 넣으려고했는데 같은 일이 여전히 발생합니다. – DicksGarage

+0

감사합니다. – DicksGarage