A mi no me aparece ningún BSOD. He probado el programa compilando en modo Debug y Release, terminando el programa de forma normal, terminando de forma abrupta (usando el botón detener en VS), y cerrando Visual Studio. Cero pantallazos azules.
Según un comentario en el siguiente hilo, el cual casualmente es de un usuario que usa Windows 7 como tú, dicen que tras haber visualizado la información de depuración del volcado de memoria del BSOD, han llegado a la conclusión de que se trata de un bug de ese sistema operativo Windows 7...
De todas formas en la documentación de Microsoft explican que se trata de un fallo por parte de algún driver instalado en el sistema (un driver de dispositivos de red, supongo, o quizás incluso pueda ser culpa de algún driver o servicio en segundo plano de algún antivirus que puedas tener en ejecución mientras haces ping), y que ocurre cuando el driver no puede liberar páginas (páginas de memoria) bloqueadas despues de una operación de entrata y salida o input/output (I/O), es decir, de una operación de escritura y lectura de las páginas bloqueadas...
Hay te explican además una posible solución.
En caso de que no sea culpa de tu antivirus, yo te propongo otra posible solución: espera a que la operación de ping finalice antes de cerrar completamente el programa.
He revisado tu código y hay varias cosas imperfectas, desde el modo en el que posicionas el Form en la esquina de la barra de tareas mediante un búcle
Do While (cuando lo puedes hacer con una simple operación matemática), hasta la implementación del
BackgroundWorker que tira excepciones del tipo
InvalidOperationException por intentar acceder a un control desde otro thread distinto desde el que fue creado. En fin, le hice algunas modificaciones y ha quedado de la siguiente manera; pruébalo a ver si con suerte te soluciona el problema en tu PC...
Imports System.ComponentModel
Imports System.Threading
Public NotInheritable Class Form1
Private ReadOnly Property HostNameOrAddress As String
Get
Return Me.TextBox2?.Text
End Get
End Property
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Dim scr As Screen = Screen.FromHandle(Me.Handle)
Me.Location = New Point((scr.WorkingArea.Right - Me.Size.Width), (scr.WorkingArea.Bottom - Me.Size.Height))
With Me.BackgroundWorker1
.WorkerReportsProgress = True
.WorkerSupportsCancellation = True
.RunWorkerAsync()
End With
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim bgw As BackgroundWorker = DirectCast(sender, BackgroundWorker)
Do Until bgw.CancellationPending
Dim elapsed As Double = Me.MedidorPing(Me.HostNameOrAddress, TimeSpan.FromSeconds(5))
Dim userState As String
If (elapsed.Equals(Double.NaN)) Then
userState = "Ping request timed out."
Else
userState = String.Format("{0:F0} ms", elapsed)
End If
bgw.ReportProgress(Nothing, userState)
Loop
bgw.ReportProgress(100, Nothing)
End Sub
Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
Me.TextBox3.Text = CStr(e.UserState)
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Me.Close()
End Sub
Private Sub HexCheckBox1_CheckedChanged(ByVal sender As Object) Handles HexCheckBox1.CheckedChanged
Me.TopMost = Me.HexCheckBox1.Checked
End Sub
Private Sub HexButton1_Click(sender As Object, e As EventArgs) Handles HexButton1.Click
DirectCast(sender, HexButton).Enabled = False
If (Me.BackgroundWorker1.IsBusy) Then
Me.BackgroundWorker1.CancelAsync()
Do While Me.BackgroundWorker1.IsBusy
Application.DoEvents()
Thread.Sleep(TimeSpan.FromMilliseconds(100))
Loop
End If
End Sub
Private Function MedidorPing(ByVal hostNameOrAddress As String, timeout As TimeSpan) As Double
If String.IsNullOrEmpty(hostNameOrAddress) Then
Return Double.NaN
End If
If Not My.Computer.Network.IsAvailable() Then
Return Double.NaN
End If
Dim sw As New Stopwatch()
Try
sw.Start()
My.Computer.Network.Ping(hostNameOrAddress, CInt(timeout.TotalMilliseconds))
sw.Stop()
Return sw.Elapsed.TotalMilliseconds
Catch ex As Exception ' ArgumentNullException, InvalidOperationException, PingException or SocketException
Return Double.NaN
End Try
End Function
End Class