Монитор URL держит увеличить использование памяти

Я написал программу мониторинга URL в vb с помощью .net 4.0. В основном он устанавливает таймер проверяет url каждые 60 минут с помощью htpwebreques / httpwebresponse и отправляет по электронной почте, если url не работает. Однако память, используемая приложением, продолжает увеличиваться каждый раз, когда проверяется url. Это, очевидно, в конечном итоге вызовет проблему, так как приложение предназначено для постоянного мониторинга веб-сайт для доступности и мониторинга машины в конечном итоге закончатся ресурсы.

Код для моей процедуры CheckURL ниже. Любой совет очень ценится, спасибо заранее.

    Private Sub checkURL()
    Timer1.Stop()
    Dim wReq As HttpWebRequest
    Dim wResp As HttpWebResponse ' WebResponse

    wReq = HttpWebRequest.Create(url)
    wReq.Method = "HEAD"
    Try
        wResp = wReq.GetResponse()
        If wResp.StatusCode = 200 Then
                txtResponse.Text = wResp.StatusCode & ": " & wResp.StatusDescription & vbNewLine & "The " & siteName & " is up"

                'Only send success results if specified
                If sendOnFailure = False Then
                    sendResults = True
                End If
            Else txtResponse.Text = "There may be a problem with the " & siteName & vbNewLine & "Please verify manually that it is operational." & vbNewLine & "The response received was:" & vbNewLine & "Status Code: " & wResp.StatusCode & " - " & wResp.StatusDescription
                sendResults = True
            End If

        wResp.Close()
        wResp = Nothing
        wReq = Nothing

    Catch ex As Exception
            txtResponse.Text = "There may be a problem with the " & siteName & vbNewLine & "The error returned was:" & vbNewLine & ex.ToString
            sendResults = True

    End Try

    txtLastCheck.Text = Now.ToString("d MMM yyyy HH:mm")
    setNextCheck()

End Sub

1 ответ

  1. Во-первых , вы должны использовать опцию Strict On, которая покажет вам, где у вас есть несоответствия типа переменной и может даже предложить корректировки для вас, например, см., где DirectCastоператор используется в следующем коде.

    Во-вторых, HttpWebResponseесть .Dispose()метод, поэтому вы должны вызвать его, когда вы закончите его использовать, или, как указал Цагглер, вы можете использоватьUsing, чтобы убедиться, что неуправляемые ресурсы очищены должным образом, Таким образом, удаляя утечку памяти, которую вы беспокоитесь. Обратите внимание, что в коде могут быть другие подобные проблемы, которые мы не видим.

    Вы не должны устанавливать вещи, чтобы Nothingв попытке избавиться от них — делать так возится с мусоросборником и ничего не делает для обеспечения их чистой утилизации.

    Option Strict On
    ' ....
    
    Private Sub checkURL()
        timer1.Stop()
        Dim wReq As HttpWebRequest = DirectCast(HttpWebRequest.Create(url), HttpWebRequest)
        wReq.Method = "HEAD"
    
        Try
            Using wResp As HttpWebResponse = DirectCast(wReq.GetResponse(), HttpWebResponse)
    
                If wResp.StatusCode = 200 Then
                    txtResponse.Text = wResp.StatusCode & ": " & wResp.StatusDescription & vbNewLine & "The " & siteName & " is up"
    
                    'Only send success results if specified
                    If sendOnFailure = False Then
                        sendResults = True
                    End If
                Else txtResponse.Text = "There may be a problem with the " & siteName & vbNewLine & "Please verify manually that it is operational." & vbNewLine & "The response received was:" & vbNewLine & "Status Code: " & wResp.StatusCode & " - " & wResp.StatusDescription
                    sendResults = True
                End If
    
                wResp.Close()
            End Using
    
        Catch ex As Exception
            txtResponse.Text = "There may be a problem with the " & siteName & vbNewLine & "The error returned was:" & vbNewLine & ex.ToString
            sendResults = True
    
        End Try
    
        txtLastCheck.Text = Now.ToString("d MMM yyyy HH:mm")
        setNextCheck()
    
    End Sub