Sì, è necessario smaltire l'operatore in background.
Potrebbe risultare più semplice utilizzare ThreadPool.QueueUserWorkItem(...)
che non richiede alcuna pulizia in seguito.
dettaglio aggiuntivo sul perché si dovrebbe sempre chiamare Dispose():
Anche se si guarda nella classe BackgroundWorker che in realtà non fa alcuna discussione ripulire nel suo metodo Dispose, è comunque importante chiamare Dispose a causa dell'effetto che la classe ha sul garbage collector.
Le classi con i finalizzatori non sono GCed immediatamente. Vengono mantenuti e aggiunti alla coda del finalizzatore. Quindi viene eseguito il thread di finalizzazione (che segue le chiamate di modello standard disposte). Ciò significa che l'oggetto sopravviverà nella generazione di GC 1. E le raccolte di gen 1 sono molto più rare delle raccolte di gen 0, quindi l'oggetto rimane in memoria per molto più tempo.
Se tuttavia si chiama Dispose(), l'oggetto non verrà aggiunto alla coda di finalizzazione, quindi è libero di essere raccolto.
Non è davvero un grosso problema, ma se ne stai creando molti, finirai per utilizzare più memoria del necessario. Dovrebbe essere considerata una buona pratica per chiamare sempre gli oggetti che hanno un metodo di smaltimento.
Quindi suppongo, tutto sommato, non è un requisito al 100% rigido e veloce. La tua app non esploderà (o creerà perdite di memoria) se non chiami Dispose(), ma in alcune circostanze potrebbe avere effetti negativi. Il worker in background è stato progettato per essere utilizzato come componente WinForms, quindi utilizzalo in questo modo, se hai requisiti diversi e non vuoi utilizzarlo come componente WinForms, non utilizzarlo, usa lo strumento corretto per il lavoro, come il ThreadPool.
fonte
2009-11-18 12:25:47
_Perché dovrebbe chiamare bgw.Dispose()? Oltre la solita logica "perché è lì". –
@Henk. Ho aggiunto alcuni dettagli in più. Non è critico al 100%, ma è stato progettato per essere chiamato. Se non vuoi chiamarlo ci sono altre classi che sono più adatte per il codice non Winforms. –