Esecuzione di codice VB/C# in modo asincrono tramite thread

' L'utilizzo di thread è consigliato nei form quando l'elaborazione da compiere ha una durata superiore ai 30 secondi.
' E' necessario adottare alcuni accorgimenti per ottenere un buon risultato.
' 1) Il thread può essere avviato da un pulsante e lo stato deve essere controllato periodicamente tramite un oggetto "timer" inserito all'interno di un oggetto Contenitore con ContenitoreAggiornamento=true, in modo da non aggiornare tutta la pagina ad ogni esecuzione E' anche opportuno inserire, sempre nel contenitore, una label che informi l'utente dello stato di avanzamento.
' 2) Nell'evento del Timer bisogna controllare lo stato del thread, come riportato nell'esempio sotto. Se si vuole aggiornare l'intera pagina al termine dell'elaborazione si può usare form.UpdateContainer(nothing)
' 3) Dentro alla procedura eseguita dal thread NON ci deve essere interazione in modifica con gli oggetti del form, ma solo, eventualmente, in lettura. Vanno anche evitate le chiamate a “form.Notification” e “form.alert”. 
' 4) Per scambiare informazioni fra la procedura eseguita dal thread e l'evento periodico eseguito dal timer, ed aggiornare di conseguenza la pagina, e, in particolare, la label con lo stato di avanzamento, o gestire il risultato al completamento, è necessario usare esclusivamente variabili globali, tramite form.GlobalVars(...).

'******************************************
' Il seguente snippet avvia un'attività tramite thread e può essere inserito nell'evento Click di un pulsante
dim trd as New System.Threading.Thread(sub() 
                                            ' inserire qui l'attività da svolgere
                                            ' in questo punto è possibile fare riferimento a proprietà e metodi come ad esempio form.GetDatabase()
                                            
                                            ' eventuali risultati possono essere condivisi con il form tramite una o più variabili globali del form
                                            form.GlobalVars("Variabile")="Risultato: xxxx"

                                            ' N.B. NON è possibile assegnare valori a campi del form!
                                       End Sub)



trd.IsBackground = True
trd.Priority = Threading.ThreadPriority.Lowest ' La priorità può essere modificata
trd.Start() ' questo fa partire il task

form.GlobalVars("Thread1")=trd  ' L'oggetto thread deve essere condiviso in una variabile globale del form poterne controllare lo stato in un altro evento

form.FindControl("Timer1").Time=now.addmilliseconds(2000) ' programma il timer che controlla lo stato del thread dopo 2 sec.
'*******************************************
' Il seguente codice deve essere inserito nell'evento dell'oggetto Timer1
dim trd as System.Threading.Thread=form.GlobalVars("Thread1")
	
if not trd is nothing
     if trd.ThreadState = Threading.ThreadState.Stopped ' task concluso
          form.alert(form.GlobalVars("Variabile")) ' Il risultato è recuperato dalla variabile globale
     Else
          form.FindControl("Timer1").Time=now.addmilliseconds(2000) ' Programma un nuovo controllo dopo altri 2 sec.
     End If 
End If