{"id":30653,"date":"2025-08-20T14:52:31","date_gmt":"2025-08-20T12:52:31","guid":{"rendered":"https:\/\/help.qualiware.it\/qw-help\/?p=30653"},"modified":"2025-08-20T18:49:45","modified_gmt":"2025-08-20T16:49:45","slug":"esecuzione-di-codice-vb-c-in-modo-asincrono-tramite-thread","status":"publish","type":"post","link":"https:\/\/help.qualiware.it\/qw-help\/esecuzione-di-codice-vb-c-in-modo-asincrono-tramite-thread\/","title":{"rendered":"Esecuzione di codice VB\/C# in modo asincrono tramite thread"},"content":{"rendered":"<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"vb\">' L'utilizzo di thread \u00e8 consigliato nei form quando l'elaborazione da compiere ha una durata superiore ai 30 secondi.\r\n' E' necessario adottare alcuni accorgimenti per ottenere un buon risultato.\r\n' 1) Il thread pu\u00f2 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.\r\n' 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\u00f2 usare form.UpdateContainer(nothing)\r\n' 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 \u201cform.Notification\u201d e \u201cform.alert\u201d. \r\n' 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, \u00e8 necessario usare esclusivamente variabili globali, tramite form.GlobalVars(...).\r\n\r\n'******************************************\r\n' Il seguente snippet avvia un'attivit\u00e0 tramite thread e pu\u00f2 essere inserito nell'evento Click di un pulsante\r\ndim trd as New System.Threading.Thread(sub() \r\n                                            ' inserire qui l'attivit\u00e0 da svolgere\r\n                                            ' in questo punto \u00e8 possibile fare riferimento a propriet\u00e0 e metodi come ad esempio form.GetDatabase()\r\n                                            \r\n                                            ' eventuali risultati possono essere condivisi con il form tramite una o pi\u00f9 variabili globali del form\r\n                                            form.GlobalVars(\"Variabile\")=\"Risultato: xxxx\"\r\n\r\n                                            ' N.B. NON \u00e8 possibile assegnare valori a campi del form!\r\n                                       End Sub)\r\n\r\n\r\n\r\ntrd.IsBackground = True\r\ntrd.Priority = Threading.ThreadPriority.Lowest ' La priorit\u00e0 pu\u00f2 essere modificata\r\ntrd.Start() ' questo fa partire il task\r\n\r\nform.GlobalVars(\"Thread1\")=trd  ' L'oggetto thread deve essere condiviso in una variabile globale del form poterne controllare lo stato in un altro evento\r\n\r\nform.FindControl(\"Timer1\").Time=now.addmilliseconds(2000) ' programma il timer che controlla lo stato del thread dopo 2 sec.\r\n'*******************************************\r\n' Il seguente codice deve essere inserito nell'evento dell'oggetto Timer1\r\ndim trd as System.Threading.Thread=form.GlobalVars(\"Thread1\")\r\n\t\r\nif not trd is nothing\r\n     if trd.ThreadState = Threading.ThreadState.Stopped ' task concluso\r\n          form.alert(form.GlobalVars(\"Variabile\")) ' Il risultato \u00e8 recuperato dalla variabile globale\r\n     Else\r\n          form.FindControl(\"Timer1\").Time=now.addmilliseconds(2000) ' Programma un nuovo controllo dopo altri 2 sec.\r\n     End If \r\nEnd If\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>&#8216; L&#8217;utilizzo di thread \u00e8 consigliato nei form quando l&#8217;elaborazione da compiere ha una durata superiore ai 30 secondi. &#8216; E&#8217; necessario adottare alcuni accorgimenti per ottenere un buon risultato. &#8216; 1) Il thread pu\u00f2 essere avviato da un pulsante e lo stato deve essere controllato periodicamente tramite un oggetto &#8220;timer&#8221; inserito all&#8217;interno di un&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"ngg_post_thumbnail":0,"footnotes":""},"categories":[65],"tags":[71],"acf":[],"_links":{"self":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/30653"}],"collection":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/comments?post=30653"}],"version-history":[{"count":5,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/30653\/revisions"}],"predecessor-version":[{"id":38115,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/posts\/30653\/revisions\/38115"}],"wp:attachment":[{"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/media?parent=30653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/categories?post=30653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/help.qualiware.it\/qw-help\/wp-json\/wp\/v2\/tags?post=30653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}