Bagikan melalui


EventWaitHandle

Kelas EventWaitHandle memungkinkan rangkaian untuk berkomunikasi satu sama lain dengan memberi sinyal dan dengan menunggu sinyal. Handel tunggu aktivitas (juga disebut hanya sebagai aktivitas) adalah handel tunggu yang dapat ditandai untuk melepaskan satu atau lebih rangkaian tunggu. Setelah diberi sinyal, handel tunggu aktivitas diatur ulang baik secara manual atau otomatis. Kelas EventWaitHandle dapat mewakili handel tunggu aktivitas lokal (aktivitas lokal) atau handel tunggu aktivitas sistem bernama (aktivitas bernama atau aktivitas sistem, yang terlihat oleh semua proses).

Catatan

Handel tunggu aktivitas bukan aktivitas .NET. Tidak ada delegasi atau penanganan aktivitas yang terlibat. Kata "aktivitas" digunakan untuk menggambarkannya karena secara tradisional disebut sebagai aktivitas sistem operasi, dan karena tindakan memberi sinyal handel tunggu menunjukkan kepada rangkaian tunggu bahwa suatu aktivitas telah terjadi.

Handel tunggu aktivitas lokal dan bernama menggunakan objek sinkronisasi sistem, yang dilindungi oleh pembungkus SafeWaitHandle untuk memastikan bahwa sumber daya dirilis. Anda dapat menggunakan metode Dispose untuk membebaskan sumber daya segera setelah Anda selesai menggunakan objek.

Handel Tunggu Aktivitas yang Diatur Ulang Secara Otomatis

Anda membuat aktivitas reset otomatis dengan menentukan EventResetMode.AutoReset kapan Anda membuat objek EventWaitHandle. Sesuai namanya, aktivitas sinkronisasi ini diatur ulang secara otomatis saat ditandai, setelah merilis satu rangkaian tunggu. Beri sinyal aktivitas dengan memanggil metode Set.

Aktivitas reset otomatis biasanya digunakan untuk menyediakan akses eksklusif ke sumber daya untuk satu rangkaian pada satu waktu. Rangkaian meminta sumber daya dengan memanggil metode WaitOne. Jika tidak ada rangkaian lain yang memegang handel tunggu, metode akan mengembalikan true dan rangkaian yang memanggil memiliki kontrol atas sumber daya.

Penting

Seperti semua mekanisme sinkronisasi, Anda harus memastikan bahwa semua jalur kode menunggu handel tunggu yang sesuai sebelum mengakses sumber daya yang dilindungi. Sinkronisasi rangkaian bersifat kooperatif.

Jika aktivitas reset otomatis ditandai saat tidak ada rangkaian yang menunggu, itu tetap ditandai sampai rangkaian mencoba untuk menunggu. Peristiwa ini merilis utas dan segera direset, memblokir utas berikutnya.

Penanganan Tunggu Peristiwa yang Direset Secara Manual

Anda membuat aktivitas reset otomatis dengan menentukan EventResetMode.ManualReset saat Anda membuat objek EventWaitHandle. Sesuai namanya, aktivitas sinkronisasi ini harus diatur ulang secara manual setelah diberi sinyal. Sampai diatur ulang, dengan memanggil metode Reset, rangkaian yang menunggu handel peristiwa segera dilanjutkan tanpa memblokir.

Aktivitas reset manual bertindak seperti gerbang kandang. Saat aktivitas tidak ditandai, benang yang menunggu di atasnya menghalangi, seperti kuda di kandang. Saat peristiwa menunjukkan sinyal, dengan memanggil metode Set, semua rangkaian tunggu bebas untuk dilanjutkan. Aktivitas tetap diberi sinyal hingga metode Reset dipanggil. Hal ini membuat aktivitas reset manual menjadi cara ideal untuk menahan rangkaian yang perlu menunggu sampai satu rangkaian menyelesaikan tugas.

Seperti kuda yang meninggalkan kandang, dibutuhkan waktu untuk rangkaian yang dilepaskan dijadwalkan oleh sistem operasi dan untuk melanjutkan eksekusi. Jika metode Reset dipanggil sebelum semua rangkaian melanjutkan eksekusi, rangkaian yang tersisa sekali lagi diblokir. Rangkaian mana yang dilanjutkan dan rangkaian mana yang diblokir bergantung pada faktor acak seperti beban pada sistem, jumlah rangkaian yang menunggu penjadwal, dan sebagainya. Ini bukan masalah jika rangkaian yang menandakan aktivitas berakhir setelah pensinyalan, yang merupakan pola penggunaan yang paling umum. Jika Anda ingin rangkaian yang memberi isyarat aktivitas untuk memulai tugas baru setelah semua rangkaian yang menunggu telah dilanjutkan, Anda harus memblokirnya sampai semua rangkaian yang menunggu telah dilanjutkan. Jika tidak, Anda memiliki kondisi balapan, dan perilaku kode tidak dapat diprediksi.

Fitur Umum untuk Aktivitas Otomatis dan Manual

Biasanya, satu atau beberapa rangkaian memblokir EventWaitHandle hingga rangkaian yang tidak diblokir memanggil metode Set, yang merilis salah satu rangkaian tunggu (dalam kasus peristiwa reset otomatis) atau semuanya (dalam kasus peristiwa reset manual). Rangkaian dapat memberi sinyal EventWaitHandle dan kemudian memblokirnya, sebagai operasi atomik, dengan memanggil metode WaitHandle.SignalAndWait statik.

Objek EventWaitHandledapat digunakan dengan WaitHandle.WaitAll statis dan metode WaitHandle.WaitAny. Karena kelas EventWaitHandle dan Mutex berasal dari WaitHandle, Anda dapat menggunakan kedua kelas dengan metode ini.

Aktivitas Bernama

Sistem operasi Windows memungkinkan handel tunggu aktivitas memiliki nama. Sebuah aktivitas bernama merupakan aktivitas sistem. Artinya, setelah aktivitas bernama dibuat, ini terlihat oleh semua rangkaian di semua proses. Dengan demikian, aktivitas bernama dapat digunakan untuk menyinkronkan aktivitas proses serta rangkaian.

Anda dapat membuat objek EventWaitHandle yang mewakili aktivitas sistem bernama dengan menggunakan salah satu konstruktor yang menentukan nama aktivitas.

Catatan

Karena aktivitas bernama merupakan aktivitas sistem, dimungkinkan untuk memiliki beberapa objek EventWaitHandle yang mewakili aktivitas bernama yang sama. Setiap kali Anda memanggil konstruktor, atau metode OpenExisting, objek EventWaitHandle baru dibuat. Menentukan nama yang sama berulang kali membuat beberapa objek yang mewakili aktivitas bernama yang sama.

Berhati-hatilah dalam menggunakan aktivitas bernama. Karena aktivitas ini adalah aktivitas sistem, proses lain yang menggunakan nama yang sama dapat memblokir rangkaian secara tak terduga. Kode berbahaya yang dijalankan pada komputer yang sama dapat menggunakan ini sebagai dasar penolakan serangan layanan.

Gunakan keamanan kontrol akses untuk melindungi objek EventWaitHandle yang mewakili aktivitas bernama, sebaiknya dengan menggunakan konstruktor yang menentukan objek EventWaitHandleSecurity. Anda juga dapat menerapkan keamanan kontrol akses menggunakan metode SetAccessControl, tetapi ini meninggalkan celah kerentanan antara waktu pembuatan handel tunggu dan waktu perlindungannya. Melindungi aktivitas dengan keamanan kontrol akses membantu mencegah serangan berbahaya, tetapi tidak menyelesaikan masalah tabrakan nama yang tidak disengaja.

Catatan

Tidak seperti kelas EventWaitHandle, kelas AutoResetEvent turunan dan ManualResetEvent hanya dapat mewakili handel tunggu lokal. Mereka tidak dapat mewakili aktivitas sistem yang disebutkan.

Lihat juga