Rumah >pembangunan bahagian belakang >C++ >Adakah Saya Perlu Membuang Tugasan TPL Kebakaran-dan-Lupakan?

Adakah Saya Perlu Membuang Tugasan TPL Kebakaran-dan-Lupakan?

Linda Hamilton
Linda Hamiltonasal
2025-01-05 16:26:42838semak imbas

Do I Need to Dispose of Fire-and-Forget TPL Tasks?

Tidak Melupuskan Tugasan TPL: Akibat dan Penyelesaian Ganti

Apabila mencetuskan tugasan untuk dijalankan di latar belakang tanpa menunggu selesai, perkara biasa penggunaan Task.Factory.StartNew() menimbulkan persoalan tentang keperluan memanggil Dispose() pada Task yang dikembalikan objek. Walaupun MSDN mengesyorkan melupuskan semua tugas, isu melupuskan tugas dalam senario khusus ini sering diabaikan.

Mengenai akibat tidak melupuskan, Stephen Toub, ahli pasukan Microsoft PFX, menjelaskan bahawa Task.Dispose() wujud untuk mengendalikan pemegang acara yang digunakan dalam senario menunggu tertentu. Walau bagaimanapun, apabila sambungan adalah cara utama untuk mengakses tugas, pemegang acara ini tidak akan diperuntukkan. Stephen Toub mencadangkan untuk bergantung pada pemuktamadan untuk mengurus tugasan ini.

Dokumentasi rasmi mengenai topik ini adalah terhad. Walau bagaimanapun, catatan blog Stephen Toub, "Adakah saya perlu melupuskan Tugasan?," mengembangkan isu ini dan menyerlahkan penambahbaikan yang diperkenalkan dalam .Net 4.5.

Secara amnya, anda tidak perlu melupuskan daripada objek Tugas pada kebanyakan masa. Sebab untuk melupuskan termasuk membebaskan sumber yang tidak terurus dengan segera dan mengelakkan kos pemuktamad. Walau bagaimanapun, pertimbangan ini biasanya tidak digunakan pada objek Tugas:

  • Dalam .Net 4.5 dan lebih baru, pemegang tunggu dalaman hanya diperuntukkan apabila menggunakan IAsyncResult.AsyncWaitHandle secara eksplisit.
  • Objek tugasan itu sendiri tidak mempunyai pemuktamad; pemegang tunggu dibalut dengan objek dengan pemuktamad, yang hanya dijalankan jika pemegang diperuntukkan.

Kaedah alternatif untuk tugasan kebakaran-dan-lupa dengan TPL:

Jika melupuskan objek tugasan masih menjadi kebimbangan, terdapat alternatif pendekatan:

  • Gunakan kaedah ThreadPool.QueueUserWorkItem() dalam .Net 3.5 atau lebih baru.
  • Buat Tugasan tanpa mengembalikannya: Task.Run(() => DoSomething( ));.
  • Gunakan kaedah Task.ContinueWith untuk melampirkan kesinambungan yang akan melakukan pembersihan automatik.

Atas ialah kandungan terperinci Adakah Saya Perlu Membuang Tugasan TPL Kebakaran-dan-Lupakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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