2017-10-11 11 views
0

私は最初のアプリを書いていますが、問題が発生しました。私のforeachループが終了した後に到達不能なアドレスが入力された場合、私のアプリケーションはBreakモードに入りますが、foreachが結果を得ると、通常通り処理されます。SendPingAsyncは、すべてのホストが到達不能な場合に休憩モードに入ります。C#

これは、例外をスローするコードの一部です:スロー

例外:がmscorlib.dll で 'System.ArgumentOutOfRangeExceptionが' 私は私が得る間違った店舗番号を指定した場合

private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    /// Verify that input box is not blank 
    if (string.IsNullOrWhiteSpace(inputBox.Text)) 
    { 
     MessageBox.Show("Cannot be left blank !", "Error"); 
     return; 
    } 

    /// Creates a list of Gateway options to try from 
    string[] gatewayArray = { "cadg0", "frdg0", "dedg0", "gbdg0", "iedg0", "usdg0", "dg", "dg0" }; 

    /// Specifies where to get store number from 
    string storeNumber = inputBox.Text; 
    string pingReply; 
    string pingStatus; 

    clearButton_Click(sender, e); 

    Ping ping = new Ping(); 

    foreach (string gateway in gatewayArray) 
     try 
     { 
      /// Replace store number with "Wait" text and changes color of box to red. 
      inputBox.Text = "Please Wait..."; 
      inputBox.Background = Brushes.Red; 

      /// Pings selected store using Async method 
      PingReply reply = await ping.SendPingAsync(gateway + storeNumber, 2000); 

      pingReply = reply.Address.ToString(); 
      pingStatus = reply.Status.ToString(); 

       /// Displays results of Ping 
       ipOne.Clear(); 
       ipOne.Text = pingReply; 
       statusOne.Clear(); 
       statusOne.Text = pingStatus; 
       if (statusOne.Text == "Success") 
       { 
        statusOne.Text = "- ONLINE -"; 
        statusOne.Background = Brushes.LightGreen; 
       } 
       else 
       { 
        statusOne.Background = Brushes.Orange; 
       } 

       /// Get name of host 
       IPHostEntry ipHostOne = Dns.GetHostEntry(pingReply); 
       string ipOneName = ipHostOne.HostName; 
       ipOneName = ipOneName.Substring(0, ipOneName.LastIndexOf(".") - 10); 
       nameOne.Text = ipOneName.ToUpper(); 

      } 

      catch (ArgumentOutOfRangeException ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

      catch (PingException) 
      { 
       /// Catches exceptions and continues 
       /// MessageBox.Show("Unreachable !"); 
      } 

未処理の 'System.ArgumentOutOfRangeException'型の例外が発生しました in mscorlib.dll StartIndexは0より小さくすることはできません。

The program '[19616] SbPinger.exe' has exited with code -1 (0xffffffff). 

は、私はのtry/catchでそれを処理しようとした:キャッチは何もしないと、プログラムがまだモードを解除入るしかし

catch (ArgumentOutOfRangeException ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

私のプログラムは、可能なすべてのデフォルトゲートウェイをpingし、見つかった場合はIPを返し、そのネットワーク上の個々のPCにpingを実行します。 Pingがゲートウェイに到達しない場合を除いて、他のすべてが機能します。 C#を数週間しか使用していなかったので、私には簡単に行きましょう。どんな助けでも大歓迎です。

ピーターだから、

+0

'string.IsNullOrWhiteSpace'は文字列が空であるかどうかをチェックするので、' inputBox.Text == "" 'は冗長です。また、ここでは間違っています。なぜなら、最初にnullをチェックすべきだからです。つまり、例外のコールスタックもここに掲載する必要があります。 – Clemens

+0

これが更新されました。それ以外のTry/catchコードも追加されました。 –

+0

コールスタックはどうですか?そして 'ipOneName.Substring(0、ipOneName.LastIndexOf("。 ") - 10)'は疑わしく見えます。あなたは常に '.'が存在し、その位置は開始から少なくとも10文字であると確信していますか? – Clemens

答えて

0

しばらく見ていると私はDns.GetHostEntryを使用しての代わりにURLをpingすることは、はるかに高速な結果が得られ、すべてのプロセスが終了し以来出てクラッシュしないことを発見した別のものを試した後。興味があればコードは次のとおりです。

// Get IP from DG adrress 
      try 
      { 
       IPHostEntry hostEntry = Dns.GetHostEntry("URL"); 
       IPAddress[] address = hostEntry.AddressList; 
       textBox.Text = address.GetValue(0).ToString(); 
      } 
      catch 
      { 
       // Catches Exception and moves on 
       // MessageBox.Show("No result", "Error"); 
      } 

ありがとうございます!

関連する問題