Creato Servizio...Cresce la memoria

venerdì 04 agosto 2006 - 15.28

Marc1982 Profilo | Newbie

CIao a tutti,
partendo proprio dall'esempio che ho preso su questo sito ho creato un servizio che non fa altro che (OGNI MINUTO) connettersi ad un DB verificare se ci sono nuovi record rispetto i precedenti e se ci sono li prende e li mette in una matrice che mi servirà in serguito per fare altre operazioni.Il codice funziona benissimo il problema è che se vedo TASKMANAGER mi accorgo che dopo una serie di volte(minuti) che si esegue il programma aumenta la "memoria utilizzata" e visto che quest è un servizio e girera sempre se aumenta anche se non di molto dopo 1 mese che gira su un server probabilmente la memoria utilizzata non giustifica il servizio.

COME POSSO RISOLVERE IL PROBLEMA?? premetto che ho chiuso anche tutte le connessioni con i db.

POSTO SOTTO IL CODICE INCRIMINATO

GRAZIE MILLE
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
.---------------------------------------------------------------------------------------------------------------------

DICHIARO PRIMA L'OGGETTO DI TIPO TIMER E GLI IMPOSTO LINTERVALLO POI NELL'EVENTO START ABILITO L'OROLOGIO E RICHIAMO LA FUNZIONE AVVIO PROGRAMMA.
Private t As New System.Timers.Timer(60000)
Protected Overrides Sub OnStart(ByVal args() As String)
t.Enabled = True
AvvioProgramma()
AddHandler t.Elapsed, AddressOf TimerFired
End Sub

Protected Overrides Sub OnStop()
' Add code here to perform any tear-down necessary to stop your service.
t.Stop()
End Sub


Public Sub TimerFired(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
'scrivo nel file di log il controllo che esista il file o no
'writeTxtFile(blnCheckExists(strControlPath & strEndCodeFile).ToString())
AvvioProgramma()
End Sub
---------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------LA FUNZIONE AVVIO PROGRAMMA NON FA ALTRO CHE ATTRIBUIRE AD M(una matrice) CHE è STATA DICHIARATA FUORI UNA MATRICE DI RITORNO



Sub AvvioProgramma()

m = StringaAllarme(19248)
End Sub
---------------------------------------------------------------------------------------------------------------------
LA FUNZIONE STRINGAALLARME NON FA ALTRO CHE CONNETTERSI AL DB PREDERE IL NUMERO DEGLI ELEMENTI count E DICHIARARE UNA MATRICE E POPOLARE QUELLA MATRICE NELLA SEQUENZA CHE MI SERVE

Function StringaAllarme(ByVal UltimoVisto As Integer) As String(,)
Dim NumeroElementi As Integer
Dim cn As OleDbConnection = ConnessioneDb("LOG_IMPORT.mdb", True)
'---Conto il numeor di elementi Nuovi-----------------------------
Dim sqlCount As String = "Select Count(*)as Nelementi From LOG Where prog>" & UltimoVisto & " and msg<>'' and periferico<>8000"
Dim cmdcount As New OleDbCommand(sqlCount, cn)
Dim r As OleDbDataReader
Try
r = cmdcount.ExecuteReader
r.Read()
NumeroElementi = r("Nelementi")
cmdcount.Dispose()
r.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
'--------------------------------------------------------------------
'---Qui Ciclo i risultati e li inserisco nella matrice da far tornare
Dim MatMsg(NumeroElementi, 9) As String
'1="data"
'2="Ora"
'3="Utente"
'4="Formato di Comunicazione"
'5="allarme=1 3=Ripristino"
'6="Codice evento"
'7="area o partizione"
'8="nr zona"
'9="PROG---CAMPO CHE STA NEL DB ED é IL CONTATORE"
Dim sql As String = "Select * From LOG where prog>" & UltimoVisto & " and msg<>'' and periferico<>8000"
Dim cmd As New OleDbCommand(sql, cn)
Dim x As Integer = 0
cmd.CommandText = sql
cmd.Connection = cn
Try
r = cmd.ExecuteReader
While r.Read
'Console.WriteLine(r("data"))
MatMsg(x, 1) = r("data")
MatMsg(x, 2) = r("ora")
MatMsg(x, 9) = r("Prog")
If Len(r("msg")) > 0 Then
MatMsg(x, 3) = Mid(r("msg"), 1, 4)
MatMsg(x, 4) = Mid(r("msg"), 5, 2)
MatMsg(x, 5) = Mid(r("msg"), 7, 1)
MatMsg(x, 6) = Mid(r("msg"), 8, 3)
MatMsg(x, 7) = Mid(r("msg"), 11, 2)
MatMsg(x, 8) = Mid(r("msg"), 13, 3)
End If
x = x + 1
End While
cmd.Dispose()
r.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
cn.Close()
Return MatMsg
MatMsg = Nothing
End Function
----------------------------------------------------------------------------------------------------------------------------------------

CHE COSA SBAGLIO NON DISTRUGGO QUALCOSA CHE RIMANE IN MEMORIA???

aiutatemi.
GRAZIE MARCO




filippo.monti Profilo | Junior Member

Oltre a fare .dispose sui vari oggetti ti consiglierei di impostare a nothing i vari oggetti
Per esempio dopo

cn.dispose
fai anche
cn = nothing

Penso che il problema risieda sul garbage collector di .NET in quanto le connessioni al DB non vengono subito rilasciate

Ciao
Filippo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5