Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kelas ini EventWaitHandle memungkinkan utas untuk berkomunikasi satu sama lain dengan memberi sinyal dan dengan menunggu sinyal. Penangan tunggu peristiwa (juga disebut sebagai peristiwa) adalah penangan tunggu yang dapat diaktifkan untuk membebaskan satu atau beberapa thread yang menunggu. Setelah diberi sinyal, pengendali penantian peristiwa diatur ulang baik secara manual maupun otomatis. Kelas EventWaitHandle dapat mewakili handle tunggu peristiwa lokal (peristiwa lokal) atau handle tunggu peristiwa sistem bernama (bernama peristiwa atau peristiwa sistem, yang dapat terlihat oleh semua proses).
Nota
Handel tunggu peristiwa bukan peristiwa .NET. Tidak ada delegasi atau penangan kejadian yang terlibat. Kata "peristiwa" digunakan untuk menggambarkannya karena secara tradisional telah disebut sebagai peristiwa sistem operasi, dan karena tindakan memberi sinyal pada pegangan menunggu menandakan kepada utas program yang menunggu bahwa suatu peristiwa telah terjadi.
Handle tunggu peristiwa lokal dan yang bernama menggunakan objek sinkronisasi sistem, yang dilindungi oleh pembungkus SafeWaitHandle untuk memastikan bahwa sumber daya dilepaskan. Anda dapat menggunakan metode Dispose untuk langsung membebaskan sumber daya ketika Anda selesai menggunakan objek.
Pengendali Tunggu Acara Yang Direset Secara Otomatis
Anda membuat peristiwa reset otomatis dengan menentukan EventResetMode.AutoReset kapan Anda membuat EventWaitHandle objek. Sesuai namanya, peristiwa sinkronisasi ini diatur ulang secara otomatis saat diberi sinyal, setelah merilis satu utas tunggu. Beri sinyal peristiwa dengan memanggil metodenya Set .
Peristiwa reset otomatis biasanya digunakan untuk menyediakan akses eksklusif ke sumber daya untuk satu utas pada satu waktu. Utas meminta sumber daya dengan memanggil metode WaitOne. Jika tidak ada utas lain yang memegang handel tunggu, metode ini mengembalikan true dan utas pemanggil memiliki kontrol atas sumber daya.
Penting
Seperti halnya semua mekanisme sinkronisasi, Anda harus memastikan bahwa semua jalur kode menunggu pada pegangan tunggu yang sesuai sebelum mengakses sumber daya yang dilindungi. Sinkronisasi thread bersifat kooperatif.
Jika peristiwa reset otomatis disinyalir ketika tidak ada utas yang menunggu, peristiwa tersebut tetap disinyalir hingga utas mencoba menunggu di atasnya. Peristiwa ini melepaskan benang dan segera mereset, memblokir benang berikutnya.
Penanganan Tunggu Peristiwa yang Direset Secara Manual
Anda membuat peristiwa reset manual dengan menentukan EventResetMode.ManualReset ketika Anda membuat objek EventWaitHandle. Seperti namanya, peristiwa sinkronisasi ini harus direset secara manual setelah disinyalir. Sampai direset, dengan memanggil metode Reset, utas yang menunggu pada handle event dilanjutkan segera tanpa memblokir.
Peristiwa reset manual bertindak seperti pintu kandang. Ketika peristiwa tidak diberi sinyal, utas yang menunggu di atasnya blok, seperti kuda di kandang. Ketika peristiwa dipicu, dengan memanggil metodenya Set, semua utas tunggu dapat melanjutkan. Peristiwa tetap disinyalir hingga metodenya Reset dipanggil. Ini menjadikan peristiwa reset manual sebagai cara ideal untuk menghentikan sementara utas yang perlu menunggu sampai satu utas menyelesaikan tugas.
Seperti kuda yang meninggalkan kandang, perlu waktu bagi utas yang dilepaskan untuk dijadwalkan oleh sistem operasi dan kembali melanjutkan eksekusi. Jika metode Reset dipanggil sebelum semua utas telah melanjutkan eksekusinya, maka utas yang tersisa diblokir lagi. Utas mana yang dilanjutkan dan utas mana yang terhalang tergantung pada faktor acak seperti beban pada sistem, jumlah utas yang menunggu penjadwal, dan sebagainya. Ini bukan masalah jika utas yang menjadi penanda peristiwa berakhir setelah menandakan, karena ini adalah pola penggunaan yang paling umum. Jika Anda ingin utas yang memberi sinyal peristiwa memulai tugas baru setelah semua utas yang menunggu telah dilanjutkan, Anda perlu memblokirnya hingga semua utas selesai melanjutkan tugasnya. Jika tidak, Anda memiliki kondisi balapan, dan perilaku kode Anda tidak dapat diprediksi.
Fitur Umum untuk Peristiwa Otomatis dan Manual
Biasanya, satu atau beberapa utas terblokir pada EventWaitHandle hingga utas yang tidak diblokir memanggil metode Set, yang melepaskan salah satu utas yang menunggu (dalam kasus acara reset otomatis) atau semua utas (dalam kasus acara reset manual). Utas dapat memberi sinyal EventWaitHandle dan kemudian memblokirnya, sebagai operasi atomik, dengan memanggil metode statis WaitHandle.SignalAndWait .
EventWaitHandle objek dapat digunakan dengan metode WaitHandle.WaitAll dan WaitHandle.WaitAny statis. Karena kelas EventWaitHandle dan kelas Mutex keduanya berasal dari WaitHandle, Anda dapat menggunakan kedua kelas dengan metode ini.
Acara yang Diberi Nama
Sistem operasi Windows memungkinkan penanganan tunggu peristiwa memiliki nama. Kejadian bernama berlaku di seluruh sistem. Artinya, setelah peristiwa bernama dibuat, dapat terlihat oleh semua utas di semua proses. Dengan demikian, peristiwa yang diberi nama dapat digunakan untuk menyinkronkan aktivitas proses dan thread.
Anda dapat membuat EventWaitHandle objek yang mewakili peristiwa sistem bernama dengan menggunakan salah satu konstruktor yang menentukan nama peristiwa.
Nota
Karena peristiwa bernama memiliki sistem yang luas, dimungkinkan untuk memiliki beberapa EventWaitHandle objek yang mewakili peristiwa bernama yang sama. Setiap kali Anda memanggil konstruktor atau metode OpenExisting, sebuah objek EventWaitHandle baru dibuat. Menentukan nama yang sama berulang kali membuat beberapa objek yang mewakili peristiwa bernama yang sama.
Disarankan untuk berhati-hati dalam menggunakan acara yang sudah diberi nama. Karena luas sistem, proses lain yang menggunakan nama yang sama dapat memblokir utas Anda secara tak terduga. Kode berbahaya yang dijalankan pada komputer yang sama dapat menggunakan ini sebagai dasar serangan penolakan layanan.
Gunakan keamanan kontrol akses untuk melindungi EventWaitHandle objek yang mewakili peristiwa bernama, sebaiknya dengan menggunakan konstruktor yang menentukan EventWaitHandleSecurity objek. Anda juga dapat menerapkan keamanan kontrol akses menggunakan metode SetAccessControl, tetapi ini meninggalkan jendela kerentanan antara waktu handle tunggu acara dibuat dan saat itu dilindungi. Melindungi acara dengan keamanan pengendalian akses membantu mencegah serangan berbahaya, tetapi tidak menyelesaikan masalah tabrakan nama yang tidak disengaja.
Nota
Tidak seperti kelas EventWaitHandle, kelas turunan AutoResetEvent dan ManualResetEvent hanya dapat mewakili handle tunggu lokal. Mereka tidak dapat mewakili peristiwa sistem yang sudah ditentukan namanya.