Voglio attivare un'attività da eseguire su un thread in background. Non voglio aspettare il completamento delle attività.
In .net 3.5 avrei fatto questo:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
In .net 4 il TPL è il modo suggerito. Lo schema comune che ho visto consigliato è:
Task.Factory.StartNew(() => { DoSomething(); });
Tuttavia, il StartNew()
metodo restituisce un Task
oggetto che implementa IDisposable
. Questo sembra essere trascurato dalle persone che raccomandano questo modello. La documentazione MSDN sul Task.Dispose()
metodo dice:
"Chiama sempre Dispose prima di rilasciare il tuo ultimo riferimento all'attività."
Non è possibile chiamare dispose su un'attività finché non viene completata, quindi avere il thread principale in attesa e chiamare dispose annullerebbe il punto di eseguire su un thread in background in primo luogo. Inoltre non sembra esserci alcun evento completato / finito che potrebbe essere utilizzato per la pulizia.
La pagina MSDN sulla classe Task non commenta questo aspetto e il libro "Pro C # 2010 ..." consiglia lo stesso modello e non fa alcun commento sull'eliminazione delle attività.
So che se lo lascio, il finalizzatore lo catturerà alla fine, ma questo tornerà e mi morderà quando farò molte attività di fuoco e dimentico come questa e il thread del finalizzatore viene sopraffatto?
Quindi le mie domande sono:
- È accettabile non invitare
Dispose()
laTask
classe in questo caso? E se sì, perché e ci sono rischi / conseguenze? - C'è qualche documentazione che discute questo?
- O c'è un modo appropriato per smaltire l'
Task
oggetto che mi sono perso? - O c'è un altro modo per fare fuoco e dimenticare le attività con il TPL?