Rumah >pembangunan bahagian belakang >C++ >Mengapakah `menunggu` Dilarang Di Dalam Pernyataan `kunci` dalam C#?
Memahami Sekatan: await
dan lock
dalam C#
C#'s await
adalah penting untuk pengaturcaraan tak segerak, membolehkan operasi tidak menyekat. Walau bagaimanapun, penggunaan await
di dalam pernyataan lock
adalah dilarang sama sekali. Sekatan ini ialah pilihan reka bentuk utama untuk mengelakkan punca ralat biasa: kebuntuan.
Dokumentasi Microsoft menerangkan bahawa ungkapan await
dalam lock
menimbulkan risiko. Pelaksanaan kod boleh dijeda selepas await
menghasilkan kawalan, disambung semula kemudian pada urutan yang mungkin berbeza. Jurang masa ini boleh membawa kepada situasi di mana benang lain memperoleh kunci, membalikkan susunan kunci dan mengakibatkan kebuntuan.
Mari kita periksa contoh hipotesis:
<code class="language-csharp">class Async { public static async Task<IDisposable> Lock(object obj) { while (!Monitor.TryEnter(obj)) await Task.Yield(); return new ExitDisposable(obj); } private class ExitDisposable : IDisposable { private readonly object obj; public ExitDisposable(object obj) { this.obj = obj; } public void Dispose() { Monitor.Exit(this.obj); } } }</code>
Kod ini cuba meniru penguncian tak segerak, tetapi seperti yang ditunjukkan oleh pengkompil, ia terdedah kepada sekatan tidak tentu dalam ExitDisposable.Dispose()
, yang berpotensi membawa kepada kebuntuan. Ini berlaku kerana Monitor.Exit
mungkin dilaksanakan pada urutan yang berbeza daripada urutan yang memperoleh kunci, yang berpotensi melanggar perintah kunci.
Pada dasarnya, larangan await
dalam lock
adalah langkah proaktif untuk mengelakkan kebuntuan dalam aplikasi berbilang benang. Adalah lebih baik untuk mengelak daripada menggabungkan operasi tak segerak dengan pernyataan lock
dan pertimbangkan kaedah penyegerakan alternatif seperti kunci pembaca-penulis atau primitif penyegerakan daripada System.Threading
.
Atas ialah kandungan terperinci Mengapakah `menunggu` Dilarang Di Dalam Pernyataan `kunci` dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!