Rumah >pembangunan bahagian belakang >C++ >Mengapa Anda Tidak Boleh Menggunakan `menunggu` Di dalam Pernyataan `kunci` dalam 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!