Sto leggendo su Tasks è stato il modo preferito di fare programmazione asincrona con 4.0. Mi sto solo chiedendo se ci sono casi d'uso in cui l'uso di Tasks non dovrebbe essere preferito rispetto ai normali thread in C#?Esistono scenari in cui non è possibile utilizzare Attività?
risposta
Poiché Task
s utilizza il sottostante ThreadPool
(a meno che non sia contrassegnato come lungo), non è consigliabile utilizzarli quando si utilizza un ThreadPool
non consigliato ad es.
- lunghe operazioni di I/O che ostruiscono la coda delle attività e impediscono l'esecuzione di altre attività.
- esecuzione di operazioni che richiedono l'identità del thread come l'impostazione dell'affinità.
Questo è andato nel dettaglio qui: Should I notice a difference in using Task vs Threads in .Net 4.0?
Questa grande differenza è che il TaskFactory utilizza il pool di thread, quindi se avete un sacco di compiti che non possono iniziare immediatamente. Devono aspettare l'esecuzione di un thread gratuito. Nella maggior parte dei casi questo è accettabile ..
I thread verranno eseguiti immediatamente non appena viene chiamato. Start(), hardware permettendo.
Supponendo che il pool di thread sia corretto, le attività offrono molti vantaggi tra cui cancellazione, ContinueWith, OnSuccess, OnError, Exception aggregation e WaitAll per citarne alcuni in cima alla mia testa.
I thread saranno pronti immediatamente non appena viene chiamato. Start(). Eseguiranno quando è disponibile un core, che è spesso 'instant-ish' –
Un buon punto, dovrei chiarire che i thread sono hardware limitati mentre i task sono software limitati. – Dharun
Grazie Dharun. Il post del blog sembra avere un buon confronto tra vari approcci. http://nitoprograms.blogspot.ca/2010/08/various-implementations-of-asynchronous.html – imak
- 1. Esistono scenari in cui l'avviso C4172 Visual C++ non deve essere considerato un errore?
- 2. Scenari in cui la serializzazione Xml non riesce in .NET
- 3. Conteggio righe in cui esistono dati
- 4. Esistono casi in cui Application.Exit() non solleva l'evento FormClosing?
- 5. Non è possibile utilizzare il filatore Android?
- 6. È possibile utilizzare LINQ in PowerShell?
- 7. NHibernate in scenari disconnessi
- 8. Non è possibile utilizzare UISearchController con UICollectionView?
- 9. Esistono alternative alle icone di Microsoft Office che è possibile utilizzare nella mia applicazione?
- 10. Esistono piattaforme Unix in cui Perl non è installato per impostazione predefinita?
- 11. Non è possibile utilizzare "Analizza" con swift?
- 12. Swift: Non è possibile utilizzare NSImage .imageNamed
- 13. Non è possibile utilizzare UISplitViewController in un'app universale?
- 14. È possibile utilizzare SUBQUERY annidato in NSPredicate?
- 15. È possibile cercare JIRA per un elenco di attività secondarie i cui genitori si trovano in una query diversa?
- 16. È possibile utilizzare il metodo OnPostExcecute in valori AsyncTask RETURN?
- 17. Non è possibile utilizzare l'apostrofo in StringFormat di un'associazione XAML?
- 18. Non è possibile utilizzare Html.ActionLink in asp.net mvc spark files
- 19. Perché non è possibile utilizzare ManagementObjectSearcher in VS2010 C#
- 20. Non è possibile utilizzare in modo esplicito digitato lambda
- 21. non è possibile utilizzare l'alias in ROW_NUMBER() su SQL Server?
- 22. "fine" non è possibile utilizzare in funzione template
- 23. Non è possibile utilizzare entità HTML in un attributo titolo?
- 24. Non è possibile utilizzare riferimento DLL in C#
- 25. È possibile utilizzare il selettore di classe jolly css dove esistono più valori di classe?
- 26. Esistono motivi tecnici per cui EF 5 non è completamente supportato su .NET4.0?
- 27. È possibile utilizzare Mockito in Kotlin?
- 28. È possibile utilizzare OpenCV o una libreria simile in Javascript?
- 29. È possibile utilizzare YouTube v3 API al momento per recuperare i dati dei canali a cui l'utente non è associato?
- 30. È possibile utilizzare le pipe in OCaml?
L'affinità del thread è un ottimo punto, anche se raramente si presenta. –
+1 per aver menzionato l'IOS di lunga durata. –
Mi raccomando di continuare a utilizzare le attività per operazioni di lunga durata, purché vengano contrassegnate con LongRunning. –