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
Mary-Kate Olsenasal
2025-01-15 06:31:46890semak imbas

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>

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!

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