EventWaitHandle Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mewakili peristiwa sinkronisasi utas.
public ref class EventWaitHandle : System::Threading::WaitHandle
public class EventWaitHandle : System.Threading.WaitHandle
[System.Runtime.InteropServices.ComVisible(true)]
public class EventWaitHandle : System.Threading.WaitHandle
type EventWaitHandle = class
inherit WaitHandle
[<System.Runtime.InteropServices.ComVisible(true)>]
type EventWaitHandle = class
inherit WaitHandle
Public Class EventWaitHandle
Inherits WaitHandle
- Warisan
- Warisan
- Turunan
- Atribut
Contoh
Contoh kode berikut menggunakan metode kelebihan beban untuk memungkinkan utas utama memberi sinyal utas SignalAndWait(WaitHandle, WaitHandle) yang diblokir lalu menunggu hingga utas menyelesaikan tugas.
Contoh memulai lima utas dan memungkinkannya memblokir pada yang EventWaitHandle dibuat dengan EventResetMode.AutoReset bendera, lalu merilis satu utas setiap kali pengguna menekan tombol Enter . Contoh kemudian mengantre lima utas lain dan merilis semuanya menggunakan yang EventWaitHandle dibuat dengan EventResetMode.ManualReset bendera.
using System;
using System.Threading;
public class Example
{
// The EventWaitHandle used to demonstrate the difference
// between AutoReset and ManualReset synchronization events.
//
private static EventWaitHandle ewh;
// A counter to make sure all threads are started and
// blocked before any are released. A Long is used to show
// the use of the 64-bit Interlocked methods.
//
private static long threadCount = 0;
// An AutoReset event that allows the main thread to block
// until an exiting thread has decremented the count.
//
private static EventWaitHandle clearCount =
new EventWaitHandle(false, EventResetMode.AutoReset);
[MTAThread]
public static void Main()
{
// Create an AutoReset EventWaitHandle.
//
ewh = new EventWaitHandle(false, EventResetMode.AutoReset);
// Create and start five numbered threads. Use the
// ParameterizedThreadStart delegate, so the thread
// number can be passed as an argument to the Start
// method.
for (int i = 0; i <= 4; i++)
{
Thread t = new Thread(
new ParameterizedThreadStart(ThreadProc)
);
t.Start(i);
}
// Wait until all the threads have started and blocked.
// When multiple threads use a 64-bit value on a 32-bit
// system, you must access the value through the
// Interlocked class to guarantee thread safety.
//
while (Interlocked.Read(ref threadCount) < 5)
{
Thread.Sleep(500);
}
// Release one thread each time the user presses ENTER,
// until all threads have been released.
//
while (Interlocked.Read(ref threadCount) > 0)
{
Console.WriteLine("Press ENTER to release a waiting thread.");
Console.ReadLine();
// SignalAndWait signals the EventWaitHandle, which
// releases exactly one thread before resetting,
// because it was created with AutoReset mode.
// SignalAndWait then blocks on clearCount, to
// allow the signaled thread to decrement the count
// before looping again.
//
WaitHandle.SignalAndWait(ewh, clearCount);
}
Console.WriteLine();
// Create a ManualReset EventWaitHandle.
//
ewh = new EventWaitHandle(false, EventResetMode.ManualReset);
// Create and start five more numbered threads.
//
for(int i=0; i<=4; i++)
{
Thread t = new Thread(
new ParameterizedThreadStart(ThreadProc)
);
t.Start(i);
}
// Wait until all the threads have started and blocked.
//
while (Interlocked.Read(ref threadCount) < 5)
{
Thread.Sleep(500);
}
// Because the EventWaitHandle was created with
// ManualReset mode, signaling it releases all the
// waiting threads.
//
Console.WriteLine("Press ENTER to release the waiting threads.");
Console.ReadLine();
ewh.Set();
}
public static void ThreadProc(object data)
{
int index = (int) data;
Console.WriteLine("Thread {0} blocks.", data);
// Increment the count of blocked threads.
Interlocked.Increment(ref threadCount);
// Wait on the EventWaitHandle.
ewh.WaitOne();
Console.WriteLine("Thread {0} exits.", data);
// Decrement the count of blocked threads.
Interlocked.Decrement(ref threadCount);
// After signaling ewh, the main thread blocks on
// clearCount until the signaled thread has
// decremented the count. Signal it now.
//
clearCount.Set();
}
}
Imports System.Threading
Public Class Example
' The EventWaitHandle used to demonstrate the difference
' between AutoReset and ManualReset synchronization events.
'
Private Shared ewh As EventWaitHandle
' A counter to make sure all threads are started and
' blocked before any are released. A Long is used to show
' the use of the 64-bit Interlocked methods.
'
Private Shared threadCount As Long = 0
' An AutoReset event that allows the main thread to block
' until an exiting thread has decremented the count.
'
Private Shared clearCount As New EventWaitHandle(False, _
EventResetMode.AutoReset)
<MTAThread> _
Public Shared Sub Main()
' Create an AutoReset EventWaitHandle.
'
ewh = New EventWaitHandle(False, EventResetMode.AutoReset)
' Create and start five numbered threads. Use the
' ParameterizedThreadStart delegate, so the thread
' number can be passed as an argument to the Start
' method.
For i As Integer = 0 To 4
Dim t As New Thread(AddressOf ThreadProc)
t.Start(i)
Next i
' Wait until all the threads have started and blocked.
' When multiple threads use a 64-bit value on a 32-bit
' system, you must access the value through the
' Interlocked class to guarantee thread safety.
'
While Interlocked.Read(threadCount) < 5
Thread.Sleep(500)
End While
' Release one thread each time the user presses ENTER,
' until all threads have been released.
'
While Interlocked.Read(threadCount) > 0
Console.WriteLine("Press ENTER to release a waiting thread.")
Console.ReadLine()
' SignalAndWait signals the EventWaitHandle, which
' releases exactly one thread before resetting,
' because it was created with AutoReset mode.
' SignalAndWait then blocks on clearCount, to
' allow the signaled thread to decrement the count
' before looping again.
'
WaitHandle.SignalAndWait(ewh, clearCount)
End While
Console.WriteLine()
' Create a ManualReset EventWaitHandle.
'
ewh = New EventWaitHandle(False, EventResetMode.ManualReset)
' Create and start five more numbered threads.
'
For i As Integer = 0 To 4
Dim t As New Thread(AddressOf ThreadProc)
t.Start(i)
Next i
' Wait until all the threads have started and blocked.
'
While Interlocked.Read(threadCount) < 5
Thread.Sleep(500)
End While
' Because the EventWaitHandle was created with
' ManualReset mode, signaling it releases all the
' waiting threads.
'
Console.WriteLine("Press ENTER to release the waiting threads.")
Console.ReadLine()
ewh.Set()
End Sub
Public Shared Sub ThreadProc(ByVal data As Object)
Dim index As Integer = CInt(data)
Console.WriteLine("Thread {0} blocks.", data)
' Increment the count of blocked threads.
Interlocked.Increment(threadCount)
' Wait on the EventWaitHandle.
ewh.WaitOne()
Console.WriteLine("Thread {0} exits.", data)
' Decrement the count of blocked threads.
Interlocked.Decrement(threadCount)
' After signaling ewh, the main thread blocks on
' clearCount until the signaled thread has
' decremented the count. Signal it now.
'
clearCount.Set()
End Sub
End Class
Keterangan
Kelas ini EventWaitHandle memungkinkan utas untuk berkomunikasi satu sama lain dengan memberi sinyal. Biasanya, satu atau beberapa utas memblokir pada EventWaitHandle utas Set yang tidak diblokir memanggil metode , melepaskan satu atau beberapa utas yang diblokir. Utas dapat menandakan EventWaitHandle lalu memblokirnya, dengan memanggil metode static (Shared di Visual Basic) WaitHandle.SignalAndWait.
Note
Kelas ini EventWaitHandle menyediakan akses ke peristiwa sinkronisasi sistem bernama.
Perilaku yang EventWaitHandle telah disinyalir tergantung pada mode resetnya. Dibuat EventWaitHandle dengan EventResetMode.AutoReset bendera diatur ulang secara otomatis saat diberi sinyal, setelah merilis satu utas tunggu. Sebuah EventWaitHandle yang dibuat dengan EventResetMode.ManualReset flag tetap tersinyal sampai metode Reset-nya dipanggil.
Peristiwa reset otomatis menyediakan akses eksklusif ke sumber daya. 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.
Peristiwa reset manual seperti gerbang. Ketika peristiwa tidak diberi sinyal, utas yang menunggu di atasnya akan memblokir. Ketika peristiwa disinyalir, semua utas tunggu dirilis, dan peristiwa tetap diberi sinyal (yaitu, tunggu berikutnya tidak memblokir) sampai metodenya Reset dipanggil. Peristiwa pengaturan ulang manual berguna ketika satu utas harus menyelesaikan aktivitas sebelum utas lain dapat dilanjutkan.
objek EventWaitHandle dapat digunakan dengan metode static(Shared di Visual Basic) WaitHandle.WaitAll dan WaitHandle.WaitAny.
Untuk informasi selengkapnya, lihat bagian Interaksi utas , atau sinyal dari artikel Gambaran Umum primitif sinkronisasi .
Perhatian
Secara default, peristiwa bernama tidak dibatasi untuk pengguna yang membuatnya. Pengguna lain mungkin dapat membuka dan menggunakan peristiwa, termasuk mengganggu peristiwa dengan mengatur atau mengatur ulang secara tidak pantas. Untuk membatasi akses ke pengguna tertentu, Anda dapat menggunakan kelebihan beban konstruktor atau EventWaitHandleAcl dan meneruskan EventWaitHandleSecurity saat membuat peristiwa bernama. Hindari menggunakan peristiwa bernama tanpa batasan akses pada sistem yang mungkin memiliki pengguna yang tidak tepercaya yang menjalankan kode.
Konstruktor
| Nama | Deskripsi |
|---|---|
| EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity) |
Menginisialisasi instans EventWaitHandle baru kelas, menentukan apakah handel tunggu awalnya diberi sinyal jika dibuat sebagai akibat dari panggilan ini, baik direset secara otomatis atau manual, nama peristiwa sinkronisasi sistem, variabel Boolean yang nilainya setelah panggilan menunjukkan apakah peristiwa sistem bernama dibuat, dan keamanan kontrol akses yang akan diterapkan ke peristiwa bernama jika dibuat. |
| EventWaitHandle(Boolean, EventResetMode, String, Boolean) |
Menginisialisasi instans EventWaitHandle baru kelas, menentukan apakah handel tunggu awalnya diberi sinyal jika dibuat sebagai akibat dari panggilan ini, baik direset secara otomatis atau manual, nama peristiwa sinkronisasi sistem, dan variabel Boolean yang nilainya setelah panggilan menunjukkan apakah peristiwa sistem bernama dibuat. |
| EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions, Boolean) |
Menginisialisasi instans EventWaitHandle baru kelas, menentukan apakah handel tunggu awalnya diberi sinyal jika dibuat sebagai hasil dari panggilan ini, baik direset secara otomatis atau manual, nama peristiwa sinkronisasi sistem, opsi untuk mengatur akses cakupan pengguna dan cakupan sesi, dan variabel Boolean yang nilainya setelah panggilan menunjukkan apakah peristiwa sistem bernama dibuat. |
| EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions) |
Menginisialisasi instans EventWaitHandle baru kelas, menentukan apakah handel tunggu awalnya diberi sinyal jika dibuat sebagai akibat dari panggilan ini, baik direset secara otomatis atau manual, nama peristiwa sinkronisasi sistem, dan opsi untuk mengatur akses cakupan pengguna dan cakupan sesi. |
| EventWaitHandle(Boolean, EventResetMode, String) |
Menginisialisasi instans EventWaitHandle baru kelas, menentukan apakah handel tunggu awalnya diberi sinyal jika dibuat sebagai akibat dari panggilan ini, baik direset secara otomatis atau manual, dan nama peristiwa sinkronisasi sistem. |
| EventWaitHandle(Boolean, EventResetMode) |
Menginisialisasi instans EventWaitHandle baru kelas, menentukan apakah handel tunggu awalnya diberi sinyal, dan apakah itu direset secara otomatis atau manual. |
Bidang
| Nama | Deskripsi |
|---|---|
| WaitTimeout |
Menunjukkan bahwa WaitAny(WaitHandle[], Int32, Boolean) operasi kehabisan waktu sebelum salah satu handel tunggu disinyalir. Bidang ini konstan. (Diperoleh dari WaitHandle) |
Properti
| Nama | Deskripsi |
|---|---|
| Handle |
Kedaluwarsa.
Kedaluwarsa.
Mendapatkan atau mengatur handel sistem operasi asli. (Diperoleh dari WaitHandle) |
| SafeWaitHandle |
Mendapatkan atau mengatur handel sistem operasi asli. (Diperoleh dari WaitHandle) |
Metode
| Nama | Deskripsi |
|---|---|
| Close() |
Merilis semua sumber daya yang dipegang oleh saat ini WaitHandle. (Diperoleh dari WaitHandle) |
| CreateObjRef(Type) |
Membuat objek yang berisi semua informasi relevan yang diperlukan untuk menghasilkan proksi yang digunakan untuk berkomunikasi dengan objek jarak jauh. (Diperoleh dari MarshalByRefObject) |
| Dispose() |
Merilis semua sumber daya yang digunakan oleh instans WaitHandle kelas saat ini. (Diperoleh dari WaitHandle) |
| Dispose(Boolean) |
Saat ditimpa di kelas turunan, merilis sumber daya yang tidak dikelola yang digunakan oleh WaitHandle, dan secara opsional merilis sumber daya terkelola. (Diperoleh dari WaitHandle) |
| Equals(Object) |
Menentukan apakah objek yang ditentukan sama dengan objek saat ini. (Diperoleh dari Object) |
| GetAccessControl() |
EventWaitHandleSecurity Mendapatkan objek yang mewakili keamanan kontrol akses untuk peristiwa sistem bernama yang diwakili oleh objek saat iniEventWaitHandle. |
| GetHashCode() |
Berfungsi sebagai fungsi hash default. (Diperoleh dari Object) |
| GetLifetimeService() |
Kedaluwarsa.
Mengambil objek layanan seumur hidup saat ini yang mengontrol kebijakan seumur hidup untuk instans ini. (Diperoleh dari MarshalByRefObject) |
| GetType() |
Mendapatkan Type instans saat ini. (Diperoleh dari Object) |
| InitializeLifetimeService() |
Kedaluwarsa.
Mendapatkan objek layanan seumur hidup untuk mengontrol kebijakan seumur hidup untuk instans ini. (Diperoleh dari MarshalByRefObject) |
| MemberwiseClone() |
Membuat salinan dangkal dari Objectsaat ini. (Diperoleh dari Object) |
| MemberwiseClone(Boolean) |
Membuat salinan dangkal objek MarshalByRefObject saat ini. (Diperoleh dari MarshalByRefObject) |
| OpenExisting(String, EventWaitHandleRights) |
Membuka peristiwa sinkronisasi bernama yang ditentukan, jika sudah ada, dengan akses keamanan yang diinginkan. |
| OpenExisting(String, NamedWaitHandleOptions) |
Membuka peristiwa sinkronisasi bernama yang ditentukan, jika sudah ada. Jika opsi diatur ke pengguna saat ini saja, kontrol akses objek diverifikasi untuk pengguna panggilan. |
| OpenExisting(String) |
Membuka peristiwa sinkronisasi bernama yang ditentukan, jika sudah ada. |
| Reset() |
Mengatur status peristiwa ke nonsignaled, menyebabkan utas diblokir. |
| Set() |
Mengatur status peristiwa menjadi sinyal, memungkinkan satu atau beberapa alur tunggu untuk melanjutkan. |
| SetAccessControl(EventWaitHandleSecurity) |
Mengatur keamanan kontrol akses untuk peristiwa sistem bernama. |
| ToString() |
Mengembalikan string yang mewakili objek saat ini. (Diperoleh dari Object) |
| TryOpenExisting(String, EventWaitHandle) |
Membuka peristiwa sinkronisasi bernama yang ditentukan, jika sudah ada, dan mengembalikan nilai yang menunjukkan apakah operasi berhasil. |
| TryOpenExisting(String, EventWaitHandleRights, EventWaitHandle) |
Membuka peristiwa sinkronisasi bernama yang ditentukan, jika sudah ada, dengan akses keamanan yang diinginkan, dan mengembalikan nilai yang menunjukkan apakah operasi berhasil. |
| TryOpenExisting(String, NamedWaitHandleOptions, EventWaitHandle) |
Membuka peristiwa sinkronisasi bernama yang ditentukan, jika sudah ada, dan mengembalikan nilai yang menunjukkan apakah operasi berhasil. Jika opsi diatur ke pengguna saat ini saja, kontrol akses objek diverifikasi untuk pengguna panggilan. |
| WaitOne() |
Memblokir utas saat ini hingga saat ini WaitHandle menerima sinyal. (Diperoleh dari WaitHandle) |
| WaitOne(Int32, Boolean) |
Memblokir utas saat ini hingga saat ini WaitHandle menerima sinyal, menggunakan bilangan bulat bertanda tangan 32-bit untuk menentukan interval waktu dan menentukan apakah akan keluar dari domain sinkronisasi sebelum menunggu. (Diperoleh dari WaitHandle) |
| WaitOne(Int32) |
Memblokir utas saat ini hingga saat ini WaitHandle menerima sinyal, menggunakan bilangan bulat bertanda tangan 32-bit untuk menentukan interval waktu dalam milidetik. (Diperoleh dari WaitHandle) |
| WaitOne(TimeSpan, Boolean) |
Memblokir utas saat ini hingga instans saat ini menerima sinyal, menggunakan TimeSpan untuk menentukan interval waktu dan menentukan apakah akan keluar dari domain sinkronisasi sebelum menunggu. (Diperoleh dari WaitHandle) |
| WaitOne(TimeSpan) |
Memblokir utas saat ini hingga instans saat ini menerima sinyal, menggunakan TimeSpan untuk menentukan interval waktu. (Diperoleh dari WaitHandle) |
Implementasi Antarmuka Eksplisit
| Nama | Deskripsi |
|---|---|
| IDisposable.Dispose() |
API ini mendukung infrastruktur produk dan tidak dimaksudkan untuk digunakan langsung dari kode Anda. Merilis semua sumber daya yang WaitHandledigunakan oleh . (Diperoleh dari WaitHandle) |
Metode Ekstensi
| Nama | Deskripsi |
|---|---|
| GetAccessControl(EventWaitHandle) |
Mengembalikan deskriptor keamanan untuk |
| GetSafeWaitHandle(WaitHandle) |
Mendapatkan handel yang aman untuk handel tunggu sistem operasi asli. |
| SetAccessControl(EventWaitHandle, EventWaitHandleSecurity) |
Mengatur deskriptor keamanan untuk handel tunggu peristiwa yang ditentukan. |
| SetSafeWaitHandle(WaitHandle, SafeWaitHandle) |
Mengatur handel yang aman untuk handel tunggu sistem operasi asli. |
Berlaku untuk
Keamanan Thread
Jenis ini aman untuk utas.
Lihat juga
- WaitHandle
- AutoResetEvent
- ManualResetEvent
-
Managed Threading - Gambaran umum primitif sinkronisasi