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

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

Mary-Kate Olsen
Lepaskan: 2025-01-15 06:31:46
asal
805 orang telah melayarinya

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

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan