Rumah > pembangunan bahagian belakang > C++ > Patutkah Saya Membuang() Tugasan TPL Kebakaran dan Lupakan?

Patutkah Saya Membuang() Tugasan TPL Kebakaran dan Lupakan?

Linda Hamilton
Lepaskan: 2025-01-03 22:01:41
asal
295 orang telah melayarinya

Should I Dispose() of Fire-and-Forget TPL Tasks?

Memahami Keperluan untuk Buang() pada Tugasan TPL

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan