2016-12-28 4 views
0

Я написал программу мониторинга URL-адресов в vb, используя .net 4.0. В основном он устанавливает таймер, который проверяет URL каждые 60 минут, используя htpwebreques/httpwebresponse, и отправляет электронное письмо, если URL-адрес не работает. Однако память, используемая приложением, постоянно увеличивается каждый раз, когда 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 
+2

Запрос обертки в операциях 'Using', так как это гарантирует, что ваши объекты будут удалены. Прямо сейчас они не устраиваются. – Codexer

+0

@ Zaggler спасибо, но я попытался добавить инструкцию using, но получить ошибки «Variable» wRes 'скрывает переменную в закрывающем блоке, а StatusCode не является членом WebResponse « – omicron

ответ

0

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

Во-вторых, HttpWebResponse имеет метод .Dispose(), так что вы должны позвонить, что, когда вы закончили использовать его, или, как Zaggler отметил, вы можете использовать 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 
+0

Я реализовал блок использования, как в приведенном выше коде, но я все еще получая постоянное увеличение памяти. В качестве теста я добавил инструкцию gc.collect() после окончания использования, а затем использование памяти остается стабильным. Но я понимаю, что это не очень хорошая практика. Любые идеи, которые могут быть неправильными, похожи на сборщик мусора, не освобождают ресурсы после размещения объектов. – omicron

+0

Возможно, память программы увеличится до некоторой величины и выровнятся, или сборщик мусора может сделать больше, если компьютер попадет под давление памяти. Вы создаете много строк в другом месте программы? - если это так, то ['StringBuilder'] (https://msdn.microsoft.com/en-us/library/system.text.stringbuilder (v = vs.110) .aspx) может иметь большое значение. –