Saya ingin memicu tugas untuk dijalankan di thread latar belakang. Saya tidak ingin menunggu tugas selesai.
Dalam .net 3.5 saya akan melakukan ini:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
Dalam .net 4 TPL adalah cara yang disarankan. Pola umum yang saya lihat direkomendasikan adalah:
Task.Factory.StartNew(() => { DoSomething(); });
Namun, StartNew()
metode tersebut mengembalikan Task
objek yang diimplementasikan IDisposable
. Hal ini tampaknya diabaikan oleh orang-orang yang merekomendasikan pola ini. Dokumentasi MSDN tentang Task.Dispose()
metode tersebut mengatakan:
"Selalu hubungi Buang sebelum Anda merilis referensi terakhir Anda ke Tugas."
Anda tidak dapat memanggil buang pada tugas hingga selesai, jadi meminta utas utama menunggu dan memanggil buang akan menggagalkan tujuan melakukan pada utas latar belakang sejak awal. Tampaknya juga tidak ada acara selesai / selesai yang dapat digunakan untuk pembersihan.
Halaman MSDN di kelas Tugas tidak mengomentari hal ini, dan buku "Pro C # 2010 ..." merekomendasikan pola yang sama dan tidak memberikan komentar tentang pembuangan tugas.
Saya tahu jika saya membiarkannya, finalizer akan menangkapnya pada akhirnya, tetapi apakah ini akan kembali dan menggigit saya ketika saya melakukan banyak tugas & melupakan tugas seperti ini dan thread finalizer menjadi kewalahan?
Jadi pertanyaan saya adalah:
- Apakah dapat diterima untuk tidak memanggil
Dispose()
padaTask
kelas dalam kasus ini? Dan jika ya, mengapa dan apakah ada risiko / konsekuensi? - Apakah ada dokumentasi yang membahas hal ini?
- Atau adakah cara yang tepat untuk membuang
Task
objek yang saya lewatkan? - Atau adakah cara lain untuk melakukan tugaskan & lupakan tugas dengan TPL?