Rumah >pembangunan bahagian belakang >C++ >Mengapa Anda Tidak Boleh Menggunakan `menunggu` Di dalam Pernyataan `kunci` dalam C#?

Mengapa Anda Tidak Boleh Menggunakan `menunggu` Di dalam Pernyataan `kunci` dalam C#?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-15 11:12:45375semak imbas

Why Can't You Use `await` Inside a `lock` Statement in C#?

Sebab mengapa penggunaan lock dilarang dalam pernyataan await dalam C#

Dalam C#, pengendali await tidak boleh digunakan di dalam pernyataan lock, yang merupakan pilihan reka bentuk yang disengajakan oleh pasukan pengkompil. Walaupun melaksanakan fungsi ini tidak sukar, ia dianggap sebagai amalan berbahaya yang boleh membawa kepada kebuntuan.

Sebab di sebalik sekatan

Membenarkan penggunaan lock dalam penyataan await menghasilkan pelaksanaan kod sewenang-wenang antara masa apabila await melepaskan kawalan dan penyambungan semula kaedah berikutnya. Kod ini mungkin memperoleh kunci dalam susunan yang bercanggah dengan hierarki kunci asal, menyebabkan kebuntuan.

Selain itu, await pelaksanaan boleh disambung semula pada urutan yang berbeza daripada urutan yang asalnya memperoleh kunci. Ini membawa kepada kemungkinan membuka kunci pada benang yang berbeza daripada yang memperoleh kunci, yang sangat tidak diingini.

Kesan pada pelaksanaan kunci tersuai

Percubaan untuk memintas pengehadan ini menggunakan pelaksanaan kunci tersuai (seperti yang disediakan dalam contoh kod yang diberikan) boleh mengakibatkan tingkah laku yang tidak dapat diramalkan dan berpotensi menemui jalan buntu. Ini kerana panggilan await dalam kelas ExitDisposable mungkin disekat selama-lamanya jika utas lain memperoleh kunci semasa operasi Monitor.Exit sedang dijalankan.

Kesimpulan

Walaupun pengendali await menyediakan keupayaan pengaturcaraan tak segerak yang berkuasa, adalah penting untuk memahami kepentingan mengikuti amalan terbaik yang disyorkan, termasuk melarang penggunaan lock dalam pernyataan await. Sekatan ini bertujuan untuk mengelakkan kebuntuan dan memastikan keselamatan dan kebolehpercayaan kod berbilang benang.

Atas ialah kandungan terperinci Mengapa Anda Tidak Boleh Menggunakan `menunggu` Di dalam Pernyataan `kunci` dalam C#?. 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