#vb.net #timer
#vb.net #таймер
Вопрос:
Я получаю эту ошибку, которую, похоже, не могу решить с помощью try … catch, и мне нужен ваш совет о том, как это решить. Есть еще код, но я считаю, что это связано с ошибкой, которую я получаю. Код такой:
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Dim ip As String
Dim sw As New Stopwatch
ip = "some.ip.com"
Try
If My.Computer.Network.Ping(ip) Then
ping = (sw.ElapsedMilliseconds)
Label1.Text = ping amp; "ms"
sw.Stop()
MsgBox("You have no connection.")
End If
Catch ex As Exception
MsgBox(ex)
End Try
If ping < 200 Then
Label2.BackColor = Color.Green
Label2.Text = "Good Connection"
ElseIf ping > 200 Then
Label2.BackColor = Color.Orange
Label2.Text = "Medium connection"
ElseIf ping > 400 Then
Label2.BackColor = Color.Red
Label2.Text = "Bad Connection"
ElseIf ping <= 0 Then
Label2.Text = "No Connection"
Label2.BackColor = Color.Brown
End If
Ошибка выдает ошибку исключения:
************** Exception Text **************
System.Net.NetworkInformation.PingException: An exception occurred during a Ping request. ---> System.Net.Sockets.SocketException: The requested name is valid, but no data of the requested type was found
at System.Net.Dns.GetAddrInfo(String name)
at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
at System.Net.Dns.GetHostAddresses(String hostNameOrAddress)
at System.Net.NetworkInformation.Ping.Send(String hostNameOrAddress, Int32 timeout, Byte[] buffer, PingOptions options)
— Завершение трассировки внутреннего стека исключений —
в System.Net.NetworkInformation.Ping.Send(строка hostNameOrAddress, тайм-аут Int32, буфер Byte[], параметры PingOptions)
в System.Net.NetworkInformation.Ping.Send(строка hostNameOrAddress, тайм-аут Int32, буфер байт[])
в Microsoft.VisualBasic.Devices.Сеть.Пинг (строка hostNameOrAddress, тайм-аут Int32)
в Microsoft.VisualBasic.Devices.Сеть.Ping(строка hostNameOrAddress)
в Sky_Casino.Form2.timer1_Tick(отправитель объекта, EventArgs e) в C:Userstonakis2108DocumentsVisual Studio 2013Projects somethingsomethingForm2.vb: строка 61
в системе.Windows.Формы.Таймер.OnTick (EventArgs e)
в системе.Windows.Формы.Таймер.TimerNativeWindow.WndProc(Messageamp; m)
в системе.Windows.Формы.NativeWindow.Обратный вызов (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Я хочу, чтобы мой код выполнял пинг цели, возвращал пинг в ms через sw и делал это каждые 5 секунд.
Я получаю эту ошибку, когда отключаю соединение, чтобы проверить наличие ошибок, пока я подключен к программе. Кто-нибудь может помочь?
Комментарии:
1. Он не знает, что это за машина «some.ip.com «. Я тоже этого не делаю. Когда вы отсоедините кабель, вы, конечно, также потеряете соединение с DNS-сервером и возможность разрешения «some.ip.com » на IP-адрес.
2. Почему вы не можете «решить с помощью try … catch»? Вероятно, вы не хотите показывать окно сообщения при возникновении исключения, но предположительно исключение перехватывается? Можете ли вы просто установить
ping = -1
блок catch?3. @Mark что вы имеете в виду? Я хочу показать пинг пользователям в ms. Я хотел сказать, что try … catch не работает, потому что, похоже, я все еще получаю исключение по таймеру.
4. @Tonakis2108 исключение все равно будет возникать, и вы по-прежнему будете отображать сообщение об ошибке, но в этом суть Try / Catch — вы можете решить, как с этим справиться. Я добавлю ответ с «рабочим» кодом.
Ответ №1:
Смысл попытки / перехвата в том, что исключение все равно будет возникать, но вы можете обработать его по своему усмотрению, вместо сбоя программы. Следующий код будет обрабатывать ошибки более корректно, и я также изменил ваши проверки на время пинга, поскольку ваша комбинация проверок меньше и больше не даст вам того, что вы хотите, и добавил более длительный тайм-аут (по умолчанию 500 мс). Все еще не лучший код, но для меня он обрабатывает отключенную сеть!
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Dim ip = "www.google.com"
Dim timeout = 1000
Dim sw = New Stopwatch()
Try
Dim ping As Long = -1
sw.Start()
If My.Computer.Network.Ping(ip, timeout) Then
sw.Stop()
ping = sw.ElapsedMilliseconds
Label1.Text = String.Format("{0}ms", ping)
End If
If ping < 0 Then
Label2.Text = "Ping Timed Out"
Label2.BackColor = Color.Brown
ElseIf ping < 200 Then
Label2.Text = "Good Connection"
Label2.BackColor = Color.Green
ElseIf ping < 400 Then
Label2.Text = "Medium Connection"
Label2.BackColor = Color.Orange
Else
Label2.Text = "Bad Connection"
Label2.BackColor = Color.Red
End If
Catch ex As Exception
Label1.Text = ""
Label2.Text = ex.Message
Label2.BackColor = Color.Red
Console.WriteLine(ex.ToString())
End Try
End Sub
Комментарии:
1. Даже если это работает таким образом, я нашел ответ на свои проблемы, наблюдая за местоположением, в котором моя студия создавала мое приложение. Хотя код работает отлично, и я действительно хочу поблагодарить вас за помощь в моей просьбе, даже если это было что-то, что я мог вызвать по ошибке. Еще раз спасибо и извините за беспокойство. (Жаль, что я не могу 1 ответ). : (