Rieccomi , cosa bisogna fare per una cassa di birra ... eheheheh ...
E allora , qualche considerazione.
In basso il tuo codice rivisto, ho implementato AWAIT come ti dicevo, e a livello di test ho incrementato la frequenza del times, per farlo 'sballare' prima.
Ho cambiato le due sub che usavi, trasmormandole in function in modo da evitare il problema del deadlock di memusata.
Ho impementato il deviatore, in modo che la prima esecuzione della function memtest, la disattiva automaticamente, senza introdurre altri cicli di attesa per il timer come avevi fatto .... il timer può lanciare anche duemila volte la sub, ma se c'è ancora una istanza attiva del vecchio task, uscirà automaticamente. Ovviamente a questo punto si poteva lasciare la sub, ma a livello didattico ho preferito darti altri spunti.
La stessa tecnica del deviatore è usata anche per TestOrario, anche se in realtà nn serve.
Poi trovi disattivata un'altra tecnica (dentro la SUB Timer1_Click), è quella del task dichiarato come globale, in testa, in modo tale da evitare di dichiararlo ogni volta, è un altro modo di chiamare la SUB che ti interessa.
Ovviamente sono semplici attrezzi di esempio che puoi usare per comporre il resto del puzzle ed ottenere quello che hai descritto poco fa. Puoi usare una tecnica o più di una, ho messo dentro un poco dei suggerimenti che ti davo qualche giorno fa.
Ah, piccola aggiunta in textbox2 metto i valori di memoria ad inizio programma, per vedere di quanto aumentano via via ... in alcuni casi addirittura la memoria impegnata dopo qualche ora è diventata di meno rispetto a quando è partito il programma.
Non ho potutto tenere acceso per giorni per vedere che succede.
Implementalo, provalo e ci dai esito.
PS. In fase di produzione, nn serve una frequenza così elevata del timer, lo puoi pure portare a 500ms tanto ti deve solo leggere dei valori e visualizzarli, se li leggi 10 volte al secondo non è che l'occhio umano li apprezza.
PPS. Ci sono (ovviamente) altri metodi per fare le stesse cose, poi naturalmente ognuno sceglie il modo o gli strumenti che preferisce (ad esempio potresti implementare le letture come servizi windows che si attivano automaticamente).
Ciao.
Gino.
Imports System.Globalization
Public Class Form1
Dim ScriviVecchioPicco As Integer = 0
Dim TestOrario As String = ""
Dim VecchioPicco As Integer = 0
Dim WithEvents timer1 As New Timer
Dim dev As Integer = 0
Dim attiv1 As Integer = 0
Dim task1 As Task
Dim attiv2 As Integer = 0
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.Show()
Me.CenterToScreen()
timer1.Interval = 10
timer1.Enabled = True
End Sub
Private Function bb() As String
Return MEM_USATA()
End Function
Private Function CaricaMemoria_Async() As Task(Of String)
Return Task.Run(Function() bb())
End Function
Private Async Sub Generale()
Dim resul = Await CaricaMemoria_Async()
TextBox3.Text = resul
If dev = 0 Then
dev = 1
TextBox2.Text = resul
End If
If ScriviVecchioPicco = 1 Then
ScriviVecchioPicco = 0
TextBox3.Text = resul
End If
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Generale()
'task1 = New Task(AddressOf ORARIO)
'task1.Start()
'TextBox3.Text = TestOrario
TextBox1.Text = ORARIO()
End Sub
Function ORARIO() As String
If attiv2 = 1 Then
Return ""
End If
attiv2 = 1
Return Format(Now.ToString("G", New CultureInfo("it-IT")))
attiv2 = 0
End Function
Function MEM_USATA() As String
If attiv1 = 1 Then
Return ""
End If
attiv1 = 1
Dim c As Process = Process.GetCurrentProcess()
Dim MemUsata = String.Empty
Dim mem = c.WorkingSet64 / 1024
MemUsata &= Format(Now.ToString("G", New CultureInfo("it-IT"))) & " --- "
MemUsata &= "WS: " & mem & " K - "
MemUsata &= "VM: " & c.PagedMemorySize64 / 1024 & " K - "
MemUsata &= "GC: " & GC.GetTotalMemory(True) & " b" & vbCrLf
If (mem) > VecchioPicco Then
VecchioPicco = mem
ScriviVecchioPicco = 1
End If
attiv1 = 0
Return MemUsata
End Function
End Class