Apabila menggunakan objek Tugas untuk tugasan kebakaran-dan-lupa, persoalan timbul: Adakah perlu memanggil Buang ()?
Pelaksanaan Benang Latar Belakang dan Task.Dispose()
Pustaka Selari Tugas (TPL) membenarkan pelaksanaan tugasan pada urutan latar belakang. Biasanya, StartNew() digunakan untuk mencipta objek Tugas, yang melaksanakan IDisposable. Menurut dokumentasi MSDN, memanggil Dispose() sebelum mengeluarkan rujukan terakhir kepada Task adalah disyorkan.
Dilema Melupuskan Tugasan Latar Belakang
Walau bagaimanapun, memanggil Dispose() memerlukan tugas yang perlu diselesaikan, yang mengalahkan tujuan menggunakan benang latar belakang. Selain itu, tiada acara penyiapan yang boleh digunakan untuk pembersihan.
Adakah Boleh Diterima untuk Tidak Membuang()?
Menurut Stephen Toub Microsoft, dalam kebanyakan kes , adalah boleh diterima untuk tidak memanggil Dispose() pada objek Tugas yang digunakan untuk kesinambungan, kerana mereka tidak akan memperuntukkan pemegang menunggu dalaman. Mulai .Net 4.5, hanya penggunaan eksplisit AsyncWaitHandle akan menyebabkan peruntukan pemegang tunggu.
Akibat dan Risiko
Toub mencatatkan bahawa objek Tugas itu sendiri tidak mempunyai pemuktamad . Pemegang menunggu mempunyai pemuktamad, tetapi ia hanya diperuntukkan apabila perlu. Oleh itu, pemuktamad tidak akan dilaksanakan melainkan pemegang penantian diperuntukkan.
Walau bagaimanapun, dalam kes di mana banyak tugasan kebakaran dan pelupaan sedang dibuat, terdapat potensi untuk utas pemuktamad menjadi terharu jika berbilang pemegang menunggu diperuntukkan.
Dokumentasi dan Terbaik Amalan
Halaman MSDN untuk kelas Tugasan tidak menangani isu ini secara eksplisit. Walau bagaimanapun, catatan blog Stephen Toub, bertajuk "Adakah saya perlu melupuskan Tugasan?", memberikan penjelasan lanjut dan mengesyorkan untuk bergantung pada pemuktamadan dalam kebanyakan kes.
Pendekatan Alternatif
Jika dikehendaki, terdapat cara untuk menyemak ketersediaan pemegang menunggu dan melupuskan Tugas jika ia telah diperuntukkan. Sebagai alternatif, seseorang boleh meneroka pilihan lain untuk tugasan kebakaran dan lupakan, seperti kaedah ThreadPool.QueueUserWorkItem atau menggunakan Sambungan Reaktif untuk .NET (Rx).
Atas ialah kandungan terperinci Patutkah Saya Membuang() Tugasan TPL Kebakaran dan Lupakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!