Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 49134|Jawab: 4

[Sumber] Monitor Prinsip Kunci .NET/C# memberikan penjelasan mendalam

[Salin tautan]
Diposting pada 29/04/2021 09.54.10 | | | |
Pernyataan kunci mengambil muteks objek tertentu, mengeksekusi blok pernyataan, lalu melepaskan kunci. Saat memegang kunci, benang yang menahan kunci dapat memperoleh dan melepaskan kunci lagi. Utas lain diblokir agar tidak mendapatkan kunci dan menunggu hingga kunci dilepaskan.

Resensi:

.net/c# Pengguna multithreaded concurrency lock(string){...} Penjelasan rinci
https://www.itsvse.com/thread-7764-1-1.html

Gunakan kode kunci

Setara dengan

Dapat dianggap bahwa kode yang mendasari Lock diimplementasikan oleh Monitor.

Karena kode menggunakan try... final, jadi meskipun pengecualian dilemparkan ke dalam isi pernyataan kunci, kunci dilepaskan.

Anda tidak dapat menggunakan kunci operator await di isi pernyataan.Anda tidak dapat menggunakannya di badan pernyataanmenunggukunci operator。 Anda tidak dapat menggunakan kunci operator await di isi pernyataan. Anda tidak dapat menggunakan kunci operator await di isi pernyataan. Kalimat ini sangat penting!

Dokumentasi:Login hyperlink terlihat.

Saya menguji kodenya sendiri,Gunakan Tugas untuk mendapatkan kunci dan gunakan await untuk memblokir, kodenya adalah sebagai berikut:

Setelah mengeksekusi kode berikut beberapa kali, hasil eksekusi tidak seperti yang diharapkan.



Mengapa? Jika Anda mencoba menggunakan kata kunci await saat mencoba menggunakan kata kunci await di blok kunci, Anda akan mendapatkan kesalahan kompilasi ini: cannot await di isi pernyataan kunci. Alasannya adalah setelah await selesai, metode dapat berjalan di utas yang berbeda alih-alih utas (utas panggilan) sebelum kata kunci await.kuncikata kunciutas yang samaDapatkan kunci dan lepaskan kunci di kunci
Ubah kode untuk melihat alasannya secara lebih intuitif:

Dapatkan id utas kunci dan id utas pelepas kunci,Jelas tidak ada utas, sehingga kunci tidak dapat berhasil dilepaskan, seperti yang ditunjukkan pada gambar di bawah ini:



Mencoba memodifikasi kode, diuji dengan utas, dieksekusi beberapa kali, dan berfungsi seperti yang diharapkan, kodenya adalah sebagai berikut:



(Akhir)





Mantan:(to).NET/C# untuk mengemas folder ke dalam file zip
Depan:Redis menggunakan skrip Lua untuk penjelasan terperinci
 Tuan tanah| Diposting pada 10/02/2022 09.20.09 |

Jangan lepaskan kunci





 Tuan tanah| Diposting pada 25/06/2023 19.57.43 |
Metode sinkronisasi objek dipanggil dari blok kode yang tidak disinkronkan.
Kode berikut akan memberikan kesalahan seperti di atas




 Tuan tanah| Diposting pada 12/08/2023 19.47.49 |
kunci sintaks sugar, seperti yang ditunjukkan di bawah ini:






 Tuan tanah| Diposting pada 11/07/2024 10.44.02 |
【Putar】 C# konkurensi multi-utas di bawah berbagai kunci
https://www.itsvse.com/thread-10561-1-1.html
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com