Bagikan melalui


Metode System.Threading.Monitor.Wait

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

metode Wait(Object, Int32, Boolean)

Metode ini tidak kembali sampai memperoleh kembali kunci eksklusif pada obj parameter .

Utas yang saat ini memiliki kunci pada objek yang ditentukan memanggil metode ini untuk melepaskan objek sehingga utas lain dapat mengaksesnya. Pemanggil diblokir saat menunggu untuk memperoleh kembali kunci. Metode ini dipanggil ketika penelepon perlu menunggu perubahan status yang akan terjadi sebagai akibat dari operasi utas lain.

Waktu habis memastikan bahwa utas saat ini tidak memblokir tanpa batas waktu jika utas lain melepaskan kunci tanpa terlebih dahulu memanggil Pulse metode atau PulseAll . Ini juga memindahkan utas ke antrean siap, melewati utas lain di depannya dalam antrean tunggu, sehingga dapat memperoleh kembali kunci lebih cepat. Utas dapat menguji nilai Wait pengembalian metode untuk menentukan apakah ia memperoleh kembali kunci sebelum waktu habis. Utas dapat mengevaluasi kondisi yang menyebabkannya memasuki tunggu, dan jika perlu panggil Wait metode lagi.

Saat utas Waitmemanggil , utas melepaskan kunci dan memasuki antrean tunggu. Pada titik ini, utas berikutnya dalam antrean siap (jika ada) diizinkan untuk mengontrol kunci. Utas yang dipanggil Wait tetap dalam antrean tunggu sampai utas yang menahan kunci memanggil PulseAll, atau yang berikutnya dalam antrean dan utas yang menahan kunci memanggil Pulse. Namun, jika millisecondsTimeout berlalu sebelum utas lain memanggil objek Pulse atau PulseAll metode ini, utas asli dipindahkan ke antrean siap untuk mendapatkan kembali kunci.

Catatan

Jika Infinite ditentukan untuk millisecondsTimeout parameter , metode ini memblokir tanpa batas waktu kecuali pemegang panggilan Pulse kunci atau PulseAll. Jika millisecondsTimeout sama dengan 0, utas Wait yang memanggil melepaskan kunci dan kemudian segera memasuki antrean siap untuk mendapatkan kembali kunci.

Pemanggil dijalankan Wait sekali, terlepas dari berapa kali Enter telah dipanggil untuk objek yang ditentukan. Secara konseptual, Wait metode menyimpan berapa kali pemanggil dipanggil Enter pada objek dan memanggil Exit sebanyak yang diperlukan untuk sepenuhnya melepaskan objek terkunci. Pemanggil kemudian memblokir sambil menunggu untuk memperoleh kembali objek. Ketika penelepon memperoleh kembali kunci, sistem memanggil Enter sebanyak yang diperlukan untuk memulihkan jumlah tersimpan Enter untuk pemanggil. Wait Memanggil melepaskan kunci untuk objek yang ditentukan saja; jika penelepon adalah pemilik kunci pada objek lain, kunci ini tidak dilepaskan.

Catatan

Objek yang disinkronkan menyimpan beberapa referensi, termasuk referensi ke utas yang saat ini memegang kunci, referensi ke antrean siap, yang berisi utas yang siap untuk mendapatkan kunci, dan referensi ke antrean tunggu, yang berisi utas yang menunggu pemberitahuan perubahan status objek.

Metode Pulse, PulseAll, dan Wait harus dipanggil dari dalam blok kode yang disinkronkan.

Keterangan untuk metode menjelaskan Pulse apa yang terjadi jika Pulse dipanggil ketika tidak ada utas yang menunggu.

metode Wait(Object, TimeSpan, Boolean)

Metode ini tidak kembali sampai memperoleh kembali kunci eksklusif pada obj parameter .

Utas yang saat ini memiliki kunci pada objek yang ditentukan memanggil metode ini untuk melepaskan objek sehingga utas lain dapat mengaksesnya. Pemanggil diblokir saat menunggu untuk memperoleh kembali kunci. Metode ini dipanggil ketika penelepon perlu menunggu perubahan status yang akan terjadi sebagai akibat dari operasi utas lain.

Waktu habis memastikan bahwa utas saat ini tidak memblokir tanpa batas waktu jika utas lain melepaskan kunci tanpa terlebih dahulu memanggil Pulse metode atau PulseAll . Ini juga memindahkan utas ke antrean siap, melewati utas lain di depannya dalam antrean tunggu, sehingga dapat memperoleh kembali kunci lebih cepat. Utas dapat menguji nilai Wait pengembalian metode untuk menentukan apakah ia memperoleh kembali kunci sebelum waktu habis. Utas dapat mengevaluasi kondisi yang menyebabkannya memasuki tunggu, dan jika perlu panggil Wait metode lagi.

Saat utas Waitmemanggil , utas melepaskan kunci dan memasuki antrean tunggu. Pada titik ini, utas berikutnya dalam antrean siap (jika ada) diizinkan untuk mengontrol kunci. Utas yang dipanggil Wait tetap dalam antrean tunggu sampai utas yang menahan kunci memanggil PulseAll, atau yang berikutnya dalam antrean dan utas yang menahan kunci memanggil Pulse. Namun, jika timeout milidetik berlalu sebelum utas lain memanggil objek Pulse atau PulseAll metode ini, utas asli dipindahkan ke antrean siap untuk mendapatkan kembali kunci.

Catatan

TimeSpan Jika mewakili -1 milidetik ditentukan untuk timeout parameter , metode ini memblokir tanpa batas waktu kecuali pemegang kunci memanggil Pulse atau PulseAll. Jika timeout 0 milidetik, utas Wait yang memanggil melepaskan kunci dan kemudian segera memasuki antrean siap untuk mendapatkan kembali kunci.

Pemanggil dijalankan Wait sekali, terlepas dari berapa kali Enter telah dipanggil untuk objek yang ditentukan. Secara konseptual, Wait metode menyimpan berapa kali pemanggil dipanggil Enter pada objek dan memanggil Exit sebanyak yang diperlukan untuk sepenuhnya melepaskan objek terkunci. Pemanggil kemudian memblokir sambil menunggu untuk memperoleh kembali objek. Ketika penelepon memperoleh kembali kunci, sistem memanggil Enter sebanyak yang diperlukan untuk memulihkan jumlah tersimpan Enter untuk pemanggil. Wait Memanggil melepaskan kunci untuk objek yang ditentukan saja; jika penelepon adalah pemilik kunci pada objek lain, kunci ini tidak dilepaskan.

Catatan

Objek yang disinkronkan menyimpan beberapa referensi, termasuk referensi ke utas yang saat ini memegang kunci, referensi ke antrean siap, yang berisi utas yang siap untuk mendapatkan kunci, dan referensi ke antrean tunggu, yang berisi utas yang menunggu pemberitahuan perubahan status objek.

Metode Pulse, PulseAll, dan Wait harus dipanggil dari dalam blok kode yang disinkronkan.

Keterangan untuk metode menjelaskan Pulse apa yang terjadi jika Pulse dipanggil ketika tidak ada utas yang menunggu.

Keluar dari konteks

ParameterexitContext tidak berpengaruh kecuali metode dipanggil Wait dari dalam konteks terkelola nondefault. Ini dapat terjadi jika utas Anda berada di dalam panggilan ke instans kelas yang berasal dari ContextBoundObject. Bahkan jika Anda saat ini menjalankan metode pada kelas yang tidak berasal dari ContextBoundObject, seperti String, Anda dapat berada dalam konteks nondefault jika ContextBoundObject ada di tumpukan Anda di domain aplikasi saat ini.

Saat kode Anda dijalankan dalam konteks nondefault, menentukan true penyebab exitContext utas keluar dari konteks terkelola nondefault (yaitu, untuk beralih ke konteks default) sebelum menjalankan Wait metode . Ini kembali ke konteks nondefault asli setelah panggilan ke Wait metode selesai.

Ini dapat berguna ketika kelas terikat konteks memiliki SynchronizationAttribute atribut yang diterapkan. Dalam hal ini, semua panggilan ke anggota kelas secara otomatis disinkronkan, dan domain sinkronisasi adalah seluruh isi kode untuk kelas. Jika kode dalam tumpukan panggilan anggota memanggil Wait metode dan menentukan untuk exitContext, utas true keluar dari domain sinkronisasi, memungkinkan utas yang diblokir pada panggilan ke anggota objek mana pun untuk dilanjutkan. Wait Ketika metode kembali, utas yang melakukan panggilan harus menunggu untuk masuk kembali ke domain sinkronisasi.