Ho una domanda stilistica sulla scelta dell'implementazione del thread in background che dovrei usare su un'app per Windows. Attualmente ho un BackgroundWorker
su un modulo che ha un ciclo infinito (while(true))
. In questo ciclo uso WaitHandle.WaitAny
per mantenere il thread che si sonnecchia fino a quando non si verifica qualcosa di interessante. Uno degli handle di evento che aspetto è un evento "StopThread
" in modo che possa uscire dal ciclo. Questo evento viene segnalato quando dal mio override Form.Dispose()
.BackgroundWorker vs background Thread
Ho letto da qualche parte che lo standard BackgroundWorker
è destinato alle operazioni che non si desidera legare all'interfaccia utente con una fine finita - come scaricare un file o elaborare una sequenza di elementi. In questo caso la "fine" è sconosciuta e solo quando la finestra è chiusa. Quindi sarebbe più appropriato per me utilizzare una discussione in background invece di BackgroundWorker
per questo scopo?
un altro problema di cui sono sicuro, supponiamo che sto cercando di disporre del modulo su cui è in esecuzione il Backgroundworker. Segnalo lo shutdownevent (ManualResetEvent) e, qualche volta dopo, DoWork uscirà con grazia.Dovrei semplicemente lasciare che il modulo vada avanti e Dispose anche se il DoWork potrebbe richiedere un po 'più di tempo per finire, o c'è un modo (ed è meglio) per fare il thread. Entrare nel worker in background fino a quando non esce e poi lasciare il Dispose del modulo continua? –
Penso che BackgroundWorker.IsBusy sia quello che stai cercando lì. – ParmesanCodice
Usa solo 'CancelAsync' (e prova per' CancellationPending' se il tuo thread eseguirà il polling su brevi intervalli, se invece vuoi che venga sollevata un'eccezione, usa un 'System.Threading.Thread.Abort()' che solleva un'eccezione all'interno del thread block stesso, scegli il modello giusto per la situazione –