salve a tutti
nel mio piccolo mondo di programmatore vb2019, proveniente da vb2015 e ancora prima da vb6, sto incappando in un problema che sembra non trovare soluzione nonostante abbia girato in lungo ed in largo la rete.
Ho notato che quando si usano i task ed i thread (questi ultimi diciamo ormai vetusti in favore dei primi) la memoria disponibile tende sempre ad aumentare piano piano fino al punto che il programma si blocca per overflow.
Premetto che non sono un mega esperto e programmo per diletto.
Ho creato un software per gestione pannelli solari; deve fare molte cose separatamente (info dall'inverter - invio dati a device iot - invio dati a cloud etc) e per far questo ho usato i threads.
ho notato che il programma si bloccava, anche dopo giorni, per mancanza di memoria.
Dopo avere letto a destra e manca, senza però trovare una risposta risolutiva, mi permetto di chiedere in modo diretto qui, per capire dove e se sbaglio qualcosa.
A dire il vero ho provato anche ad usare i task, ma il problema è rimasto.
Posto qui, a tal proposito, un mini programma che simula quello che devo fare e se lo si manda in esecuzione si vedrà che già dopo 20 minuti la memoria di partenza è di gran lunga inferiore a quella letta al momento.
Mi chiedo : come mai la chiusura automatica del task non rilascia la memoria usata ? Come debbo agire affinchè la memoria rimanga stabile e non salga piano piano fino all'impossibilità di far continuare a girare le routines ?
Imports System.Diagnostics
Imports System.Globalization
Imports System.Threading.Tasks
Public Class Form1
Dim MemUsata As String = ""
Dim TestOrario As String = ""
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.CenterToScreen()
Timer1.Interval = 50
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
txtMemUsata.AppendText(MemUsata)
TextBox1.Text = TestOrario
Dim TEST_TASK_1 As New Task(AddressOf ORARIO)
TEST_TASK_1.Start()
Dim TEST_TASK_2 As New Task(AddressOf MEM_USATA)
TEST_TASK_2.Start()
End Sub
Sub ORARIO()
TestOrario = Format(Now.ToString("G", New CultureInfo("it-IT")))
End Sub
Sub MEM_USATA()
Dim c As Process = Process.GetCurrentProcess()
MemUsata = String.Empty
MemUsata &= Format(Now.ToString("G", New CultureInfo("it-IT"))) & " --- "
MemUsata &= "WS: " & c.WorkingSet / 1024 & " K - "
MemUsata &= "VM: " & c.PagedMemorySize / 1024 & " K - "
MemUsata &= "GC: " & GC.GetTotalMemory(True) & " b" & vbCrLf
End Sub
End Class
Serve un form, un timer e due textbox : uno scrive la memoria usata e l'altro semplicemente aggiorna l'orario.
Grazie per chi vorrà aiutarmi
Modificato da fotosettore2 il 20 marzo 2020 22:47 -