2014-02-24 37 views
1

傳遞一個無效的IP,當我遇到一些麻煩SendAsync方法 - 0.0.0.51Ping.SendAsync不打回電話PingCompletedEventHandler

問題是,在回撥方法(pingSender_PingCompleted)甚至不被調用。我從來沒有看到任何錯誤。

IPAddress.TypeParse將此IP視爲「有效」IP。

這是我的代碼;請讓我知道我在這裏沒有看到什麼。

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program c = new Program(); 

      try 
      { 
       c.PingStore("0.0.0.51"); 
       Console.WriteLine("Pinged without exceptions"); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 

     private void PingStore(string ipAddress) 
     { 
      Ping pingSender = new Ping(); 

      pingSender.PingCompleted += new PingCompletedEventHandler(pingSender_PingCompleted); 

      pingSender.SendAsync(ipAddress, null); 
     } 

     private void pingSender_PingCompleted(object sender, PingCompletedEventArgs e) 
     { 
      Console.WriteLine("PingCompleted invoked. continue to be happy"); 
     } 
    } 
} 

請注意,我不能:

  1. 通過使用正則表達式

+1

我會假設這是因爲你正在使用'異步'就像一場火災而忘了。你有沒有嘗試過使用'await pingSender.SendAsync(ipAddress,null);'? –

+0

感謝評論@TravisJ,但有一個等待將擊敗對我有一個異步方法的目的。我期待這種方法被同時調用100次。如果事情在SendAsync期間南下,我不應該在回調中看到錯誤 - e.Error? – Nandun

+0

您是否嘗試過圍繞您的'pingSender.SendAsync()'調用包裝try/catch以確保它不會被剔除? – itsme86

回答

3

有過什麼來通過ip地址

任何一種控制
  • 我複雜化的代碼我已經在一個簡單的控制檯應用程序中測試了你的兩種方法,並且我得到了PingException0.0.0.51就像itsme86評論。

    這是我對正在發生的事情的猜測:你的評論「我期待這種方法被同時稱爲100次」。加上pingSender_PingCompleted未被調用暗示您正在調用工作線程上的PingStore方法(例如,使用ThreadPool)。這就是爲什麼你無法在你的主線程上趕上PingException,而pingSender_PingCompleted從來沒有被調用的原因。

    UPDATE

    在你的評論中寫道 「FYI我是在.NET 4.0。」

    你100%確定,你的應用程序的目標是v4.0,而不是v3.5或更早?

    我能夠使用您的確切代碼重現您的問題,但是在針對.NET Framework v3.5(使用您的代碼引發v4.0異常)時。

    我確實在System.dll中一些挖兩個框架版本,這是我發現:

    • Ping類中兩個框架版本的方法private PingReply InternalSend(...)使用本地方法num = (int)UnsafeNetInfoNativeMethods.IcmpSendEcho2
    • 如果發生錯誤num設置爲0,我發現每個Framework版本都以不同的方式處理這種情況。

    框架V3.5/2.0:

    if (num == 0) 
    { 
        num = Marshal.GetLastWin32Error(); 
        if (num != 0) 
        { 
         this.FreeUnmanagedStructures(); 
         return new PingReply((IPStatus)num); 
        } 
    } 
    

    Framewrk V4.0/4.5:

    if (num == 0) 
    { 
        num = Marshal.GetLastWin32Error(); 
        if (async && (long)num == 997L) 
        { 
         return null; 
        } 
        this.FreeUnmanagedStructures(); 
        this.UnregisterWaitHandle(); 
        if (async || num < 11002 || num > 11045) 
        { 
         /* NOTE! This throws the exception for 0.0.0.51 address that you're not getting */ 
         throw new Win32Exception(num); 
        } 
        return new PingReply((IPStatus)num); 
    } 
    

    正如可以在上面的代碼段,在.NET V4看到。0你應該能夠捕獲異常,而在.NET v3.5中,所有本地WIN32錯誤都將被默認處理。

  • +0

    謝謝。我剛剛將上面的確切代碼複製到控制檯應用程序,並且我沒有看到任何類型的異常在我的代碼中沒有自定義的線程邏輯,請原諒我之前的評論中的措辭,我的意思是說「我期望PingStore方法被稱爲100次,因此我需要使用SendAsync,因此ping會發生同時「。這就是說,爲什麼我沒有看到這個例外,世界其他地方似乎越來越多了?難道它是某種環境設置嗎? – Nandun

    +0

    我已經用我正確運行的確切代碼更新了該文章現在 – Nandun

    +0

    你是絕對的正確的。我應該更清楚我輸入的內容。我在.Net 3.5上。看起來像我將不得不迫使我的自己到一個醜陋的解決方法。 – Nandun