Memahami Sekatan C#: await
dalam lock
Pernyataan
Dokumentasi C# Microsoft secara jelas melarang penggunaan kata kunci await
di dalam pernyataan lock
. Ini bukan had pengkompil; ia adalah pilihan reka bentuk yang disengajakan untuk mengelakkan ralat pengaturcaraan kritikal: kebuntuan.
Bahaya Buntu
Mari kita periksa mengapa menggabungkan await
dan lock
adalah bermasalah. Pertimbangkan percubaan biasa untuk memintas sekatan:
<code class="language-csharp">using (await Async.Lock(padlock)) { await SomethingAsync(); }</code>
Walaupun nampaknya tidak berbahaya, pendekatan ini menutupi risiko yang ketara. Panggilan Monitor.Exit
dalam kaedah ExitDisposable.Dispose
mungkin disekat selama-lamanya. Ini berlaku kerana kod arbitrari boleh dilaksanakan antara titik di mana await
menghasilkan kawalan dan penyambungan semula kaedah. Kod perantara ini boleh memperoleh kunci lain, yang berpotensi membalikkan susunan pemerolehan kunci dan mencetuskan jalan buntu.
Langkah Perlindungan Penyusun
Larangan pengkompil C# terhadap await
dalam lock
pernyataan berfungsi sebagai perlindungan penting. Membenarkan gabungan ini akan meningkatkan dengan ketara kemungkinan kebuntuan, masalah yang terkenal sukar untuk nyahpepijat. Sekatan itu menghalang pembangun daripada secara tidak sengaja memperkenalkan kecacatan serentak berbahaya ini. Oleh itu, mengelakkan gabungan ini adalah penting untuk pengaturcaraan tak segerak yang mantap dan boleh dipercayai dalam C#.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menggunakan `menunggu` Di dalam Pernyataan `kunci` dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!