Uscita e evento da un Thread
-
domenica 4 marzo 2012 17:50
Ciao a tutti,
mi trovo in questa situzione, devo uscire da un thread ma allo stesso tempo sollevare anche un evento
La gestione dell'evento deve partire non appena il thread termina, per cui se scrivo exit sub per uscire dal thread, non ho la possibilità
di sollevare l'evento con Raise, come posso risolvere ?
Exit Sub RaiseEvent StatoRegistrazione(Me.ID, StatoReg.Switch)
Tutte le risposte
-
domenica 4 marzo 2012 17:59
Non so come hai organizzato il thread, ma credo che ti basti fare la RaiseEvent subito prima di richiamare Exit Sub.
Altrimenti, potresti utilizzare un BackgroundWorker, che fornisce un evento generato nel momento in cui l'esecuzione della sua computazione termina (RunWorkerCompleted), sia perché è effettivamente finita, sia perché è stata cancellata.
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva- Modificato Marco MinervaMicrosoft Community Contributor domenica 4 marzo 2012 18:00
- Modificato Marco MinervaMicrosoft Community Contributor domenica 4 marzo 2012 18:02
- Modificato Marco MinervaMicrosoft Community Contributor domenica 4 marzo 2012 18:03
-
domenica 4 marzo 2012 19:13
L'ho fatto, ma il gestore che gestisce l'evento deve avere il thread terminato, capisci qual'è il problema ?
Tieni presente che il thread solleva l'evento in un caso particolare.
A me interessa capire se è terminato perchè si trova in questo caso particolare o per un qualsiasi altro problema, devo fare la distinzione -
domenica 4 marzo 2012 19:28
L'ho fatto, ma il gestore che gestisce l'evento deve avere il thread terminato, capisci qual'è il problema ?
Senza vedere il codice, è difficile capire perché hai bisogno di questa cosa :-)
Ad ogni modo, visto che il tuo requisito è questo, dovresti usare il BackgroundWorker, come ti ho suggerito prima.
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva -
domenica 4 marzo 2012 19:33Ma se utilizzo il BackgroundWorker mi viene abbassata la priorità del thread ? A me interessa che il thread sia attivo
-
domenica 4 marzo 2012 19:37
Assolutamente no, l'uso del BackgroundWorker non influenza minimamente la priorità del thread.
Anzi, di solito si consiglia di usare il BackgroundWorker nei casi in cui c'è bisogno di un thread secondario proprio perché, rispetto alla creazione manuale di un oggetto Thread, è più facile da gestire.
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva -
domenica 4 marzo 2012 19:47Ma l'evento RunWorkerCompleted viene sollevato dal thread quando dentro al thread esco con Exit Sub ?
-
domenica 4 marzo 2012 19:52
L'evento RunWorkerCompleted viene generato nel momento in cui termina l'esecuzione del codice che hai inserito in DoWork (che come detto viene eseguito in un thread separato). Dai un'occhiata all'esempio che trovi qui: http://msdn.microsoft.com/it-it/library/system.componentmodel.backgroundworker.aspx per capire come funziona.
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva -
domenica 4 marzo 2012 19:55Un'ultima cosa prima di cimentarmi nel tuo consiglio, dentro il DoWork posso sollevare altri eventi ?
-
domenica 4 marzo 2012 19:59
Puoi sollevare tutti gli eventi che vuoi, ma se in particolare a te interessa fare notifiche sull'avanzamento dell'elaborazione, ti consiglio di usare l'evento ReportProgress del BackgroundWorker, che lancia l'evento ProgressChanged.
Nel link che ti ho fornito prima trovi un esempio anche di questo meccanismo.
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva -
domenica 4 marzo 2012 21:44Sto provando a modificare la mia classe, ma quando invoco il metoro CancelAsync, il thread non si interrompe subito, passa un pò di tempo.
A me invece serve che si interrompa + velocemente, cosa che ottengo con la classe Thread.
Inoltre a me serve gestire un'eccezione quando il thread sta per essere abortito, cosa che non posso fare con BackgroundWorker -
domenica 4 marzo 2012 21:49
Sto provando a modificare la mia classe, ma quando invoco il metoro CancelAsync, il thread non si interrompe subito, passa un pò di tempo.
A me invece serve che si interrompa + velocemente, cosa che ottengo con la classe Thread.In che senso non si interrompe subito? Che codice usi per verificare se deve essere chiuso? E che metodo usavi con la classe Thread?
Inoltre a me serve gestire un'eccezione quando il thread sta per essere abortito, cosa che non posso fare con BackgroundWorker
Puoi spiegarti meglio? Di che tipo di eccezioni parli?
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva -
domenica 4 marzo 2012 21:56Il thread deve terminare e il chiamante deve ricevere una notifica per avviare altre operazioni, questo è il mio problema
-
domenica 4 marzo 2012 21:58
Non devi usare nessun evento per segnalare il fine del thread, la prassi vuole che se quello che è il thread padre deve aspettare la fine dell'esecuzione del figlio per effettuare qualche cosa, metti un [thread].join proprio nel punto in cui deve stopparsi ed aspettare la fine del thread..
Perdonami, ma non sono d'accordo. In questo modo, come puoi fare in modo che il thread principale possa proseguire la sua elaborazione, ma venga notificato quando il thread secondario è terminato?
Supponi che io sia in un'applicazione Windows, premo un pulsante per avviare il thread secondario. Se io voglio che l'esecuzione normale dell'applicazione continui, ma nel frattempo voglio ricevere una notifica solo quando il thread secondario termina, non posso usare il metodo Join, perché esso bloccherebbe il thread principale, bloccando di fatto l'intera applicazione.
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva- Modificato Marco MinervaMicrosoft Community Contributor domenica 4 marzo 2012 21:58
-
domenica 4 marzo 2012 22:15
Non devi usare nessun evento per segnalare il fine del thread, la prassi vuole che se quello che è il thread padre deve aspettare la fine dell'esecuzione del figlio per effettuare qualche cosa, metti un [thread].join proprio nel punto in cui deve stopparsi ed aspettare la fine del thread..
Perdonami, ma non sono d'accordo. In questo modo, come puoi fare in modo che il thread principale possa proseguire la sua elaborazione, ma venga notificato quando il thread secondario è terminato?
Supponi che io sia in un'applicazione Windows, premo un pulsante per avviare il thread secondario. Se io voglio che l'esecuzione normale dell'applicazione continui, ma nel frattempo voglio ricevere una notifica solo quando il thread secondario termina, non posso usare il metodo Join, perché esso bloccherebbe il thread principale, bloccando di fatto l'intera applicazione.
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominervaconcordo pienamente
l'uso del Join è sconsigliato a prescindere, e comunque non è questo il caso d'uso
l'idea dell'evento è buona e leggera, altrimenti si dovrebbero usare degli handler (autoresetevent, manualresetevent)
il background worker non cambia la priorità di esecuzione, ma cambia il tipo di thread, da foreground (mantiene in vita il processo) a background (non mantiene in vita il processo), per il resto nessuna differenza
personalmente consiglio l'uso del background worker, o del ThreadPool o del TPL, il Thread è sconsigliato ormai
a presto
-
domenica 4 marzo 2012 22:18
kio2008, se rispondi alle domande che ti ho fatto, vedremo di trovare una soluzione, ti garantisco che tutti i problemi che hai segnalato come tranquillamente risolvibili usando il BackgroundWorker.
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva

