' 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