ManualResetEvent 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 yang, ketika disinyalir, harus diatur ulang secara manual. Kelas ini tidak dapat diwariskan.
public ref class ManualResetEvent sealed : System::Threading::EventWaitHandle
public ref class ManualResetEvent sealed : System::Threading::WaitHandle
public sealed class ManualResetEvent : System.Threading.EventWaitHandle
public sealed class ManualResetEvent : System.Threading.WaitHandle
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class ManualResetEvent : System.Threading.EventWaitHandle
type ManualResetEvent = class
inherit EventWaitHandle
type ManualResetEvent = class
inherit WaitHandle
[<System.Runtime.InteropServices.ComVisible(true)>]
type ManualResetEvent = class
inherit EventWaitHandle
Public NotInheritable Class ManualResetEvent
Inherits EventWaitHandle
Public NotInheritable Class ManualResetEvent
Inherits WaitHandle
- Warisan
- Warisan
- Warisan
- Atribut
Contoh
Contoh berikut menunjukkan cara ManualResetEvent kerjanya. Contoh dimulai dengan ManualResetEvent dalam status tidak ditandatangani (yaitu, false diteruskan ke konstruktor). Contohnya membuat tiga utas, yang masing-masing memblokir dengan ManualResetEvent memanggil metodenya WaitOne . Saat pengguna menekan tombol Enter , contoh memanggil Set metode , yang merilis ketiga utas. Berbeda dengan perilaku AutoResetEvent kelas, yang merilis utas satu per satu, mengatur ulang secara otomatis setelah setiap rilis.
Menekan tombol Enter lagi menunjukkan bahwa ManualResetEvent tetap dalam status sinyal hingga metodenya Reset dipanggil: Contoh memulai dua utas lagi. Utas ini tidak memblokir ketika mereka memanggil WaitOne metode , tetapi sebaliknya berjalan hingga selesai.
Menekan tombol Enter lagi menyebabkan contoh memanggil Reset metode dan memulai satu utas lagi, yang memblokir saat memanggil WaitOne. Menekan tombol Enter satu kali terakhir memanggil untuk merilis utas Set terakhir, dan program berakhir.
using System;
using System.Threading;
public class Example
{
// mre is used to block and release threads manually. It is
// created in the unsignaled state.
private static ManualResetEvent mre = new ManualResetEvent(false);
static void Main()
{
Console.WriteLine("\nStart 3 named threads that block on a ManualResetEvent:\n");
for(int i = 0; i <= 2; i++)
{
Thread t = new Thread(ThreadProc);
t.Name = "Thread_" + i;
t.Start();
}
Thread.Sleep(500);
Console.WriteLine("\nWhen all three threads have started, press Enter to call Set()" +
"\nto release all the threads.\n");
Console.ReadLine();
mre.Set();
Thread.Sleep(500);
Console.WriteLine("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()" +
"\ndo not block. Press Enter to show this.\n");
Console.ReadLine();
for(int i = 3; i <= 4; i++)
{
Thread t = new Thread(ThreadProc);
t.Name = "Thread_" + i;
t.Start();
}
Thread.Sleep(500);
Console.WriteLine("\nPress Enter to call Reset(), so that threads once again block" +
"\nwhen they call WaitOne().\n");
Console.ReadLine();
mre.Reset();
// Start a thread that waits on the ManualResetEvent.
Thread t5 = new Thread(ThreadProc);
t5.Name = "Thread_5";
t5.Start();
Thread.Sleep(500);
Console.WriteLine("\nPress Enter to call Set() and conclude the demo.");
Console.ReadLine();
mre.Set();
// If you run this example in Visual Studio, uncomment the following line:
//Console.ReadLine();
}
private static void ThreadProc()
{
string name = Thread.CurrentThread.Name;
Console.WriteLine(name + " starts and calls mre.WaitOne()");
mre.WaitOne();
Console.WriteLine(name + " ends.");
}
}
/* This example produces output similar to the following:
Start 3 named threads that block on a ManualResetEvent:
Thread_0 starts and calls mre.WaitOne()
Thread_1 starts and calls mre.WaitOne()
Thread_2 starts and calls mre.WaitOne()
When all three threads have started, press Enter to call Set()
to release all the threads.
Thread_2 ends.
Thread_0 ends.
Thread_1 ends.
When a ManualResetEvent is signaled, threads that call WaitOne()
do not block. Press Enter to show this.
Thread_3 starts and calls mre.WaitOne()
Thread_3 ends.
Thread_4 starts and calls mre.WaitOne()
Thread_4 ends.
Press Enter to call Reset(), so that threads once again block
when they call WaitOne().
Thread_5 starts and calls mre.WaitOne()
Press Enter to call Set() and conclude the demo.
Thread_5 ends.
*/
Imports System.Threading
Public Class Example
' mre is used to block and release threads manually. It is
' created in the unsignaled state.
Private Shared mre As New ManualResetEvent(False)
<MTAThreadAttribute> _
Shared Sub Main()
Console.WriteLine(vbLf & _
"Start 3 named threads that block on a ManualResetEvent:" & vbLf)
For i As Integer = 0 To 2
Dim t As New Thread(AddressOf ThreadProc)
t.Name = "Thread_" & i
t.Start()
Next i
Thread.Sleep(500)
Console.WriteLine(vbLf & _
"When all three threads have started, press Enter to call Set()" & vbLf & _
"to release all the threads." & vbLf)
Console.ReadLine()
mre.Set()
Thread.Sleep(500)
Console.WriteLine(vbLf & _
"When a ManualResetEvent is signaled, threads that call WaitOne()" & vbLf & _
"do not block. Press Enter to show this." & vbLf)
Console.ReadLine()
For i As Integer = 3 To 4
Dim t As New Thread(AddressOf ThreadProc)
t.Name = "Thread_" & i
t.Start()
Next i
Thread.Sleep(500)
Console.WriteLine(vbLf & _
"Press Enter to call Reset(), so that threads once again block" & vbLf & _
"when they call WaitOne()." & vbLf)
Console.ReadLine()
mre.Reset()
' Start a thread that waits on the ManualResetEvent.
Dim t5 As New Thread(AddressOf ThreadProc)
t5.Name = "Thread_5"
t5.Start()
Thread.Sleep(500)
Console.WriteLine(vbLf & "Press Enter to call Set() and conclude the demo.")
Console.ReadLine()
mre.Set()
' If you run this example in Visual Studio, uncomment the following line:
'Console.ReadLine()
End Sub
Private Shared Sub ThreadProc()
Dim name As String = Thread.CurrentThread.Name
Console.WriteLine(name & " starts and calls mre.WaitOne()")
mre.WaitOne()
Console.WriteLine(name & " ends.")
End Sub
End Class
' This example produces output similar to the following:
'
'Start 3 named threads that block on a ManualResetEvent:
'
'Thread_0 starts and calls mre.WaitOne()
'Thread_1 starts and calls mre.WaitOne()
'Thread_2 starts and calls mre.WaitOne()
'
'When all three threads have started, press Enter to call Set()
'to release all the threads.
'
'
'Thread_2 ends.
'Thread_0 ends.
'Thread_1 ends.
'
'When a ManualResetEvent is signaled, threads that call WaitOne()
'do not block. Press Enter to show this.
'
'
'Thread_3 starts and calls mre.WaitOne()
'Thread_3 ends.
'Thread_4 starts and calls mre.WaitOne()
'Thread_4 ends.
'
'Press Enter to call Reset(), so that threads once again block
'when they call WaitOne().
'
'
'Thread_5 starts and calls mre.WaitOne()
'
'Press Enter to call Set() and conclude the demo.
'
'Thread_5 ends.
Keterangan
Anda menggunakan ManualResetEvent, AutoResetEvent, dan EventWaitHandle untuk interaksi utas (atau sinyal utas). Untuk informasi selengkapnya, lihat bagian Interaksi utas , atau sinyal dari artikel Gambaran Umum primitif sinkronisasi .
Ketika utas memulai aktivitas yang harus diselesaikan sebelum utas lain dilanjutkan, alur memanggil ManualResetEvent.Reset untuk dimasukkan ManualResetEvent ke dalam status tidak diberi sinyal. Utas ini dapat dianggap sebagai mengendalikan ManualResetEvent. Utas yang memanggil blok ManualResetEvent.WaitOne , menunggu sinyal. Ketika utas pengontrol menyelesaikan aktivitas, alur ini memanggil ManualResetEvent.Set untuk memberi sinyal bahwa utas tunggu dapat dilanjutkan. Semua utas tunggu dirilis.
Setelah disinyalir, ManualResetEvent tetap diberi sinyal sampai diatur ulang secara manual dengan memanggil Reset() metode . Artinya, panggilan untuk WaitOne segera kembali.
Anda dapat mengontrol status awal dengan ManualResetEvent meneruskan nilai Boolean ke konstruktor: true jika status awal diberi sinyal, dan false sebaliknya.
ManualResetEvent juga dapat digunakan dengan staticWaitAll metode dan WaitAny .
Dimulai dengan .NET Framework versi 2.0, ManualResetEvent berasal dari kelas EventWaitHandle. secara ManualResetEvent fungsional setara dengan yang EventWaitHandle dibuat dengan EventResetMode.ManualReset.
Nota
ManualResetEvent Tidak seperti kelas , EventWaitHandle kelas menyediakan akses ke peristiwa sinkronisasi sistem bernama.
Dimulai dengan .NET Framework versi 4.0, kelas System.Threading.ManualResetEventSlim adalah alternatif ringan untuk ManualResetEvent.
Konstruktor
| Nama | Deskripsi |
|---|---|
| ManualResetEvent(Boolean) |
Menginisialisasi instans ManualResetEvent baru kelas dengan nilai Boolean yang menunjukkan apakah akan mengatur status awal ke sinyal. |
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. (Diperoleh dari EventWaitHandle) |
| 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) |
| Reset() |
Mengatur status peristiwa ke nonsignaled, yang menyebabkan utas diblokir. |
| Reset() |
Mengatur status peristiwa ke nonsignaled, menyebabkan utas diblokir. (Diperoleh dari EventWaitHandle) |
| Set() |
Mengatur status peristiwa ke sinyal, yang memungkinkan satu atau beberapa utas tunggu untuk dilanjutkan. |
| Set() |
Mengatur status peristiwa menjadi sinyal, memungkinkan satu atau beberapa alur tunggu untuk melanjutkan. (Diperoleh dari EventWaitHandle) |
| SetAccessControl(EventWaitHandleSecurity) |
Mengatur keamanan kontrol akses untuk peristiwa sistem bernama. (Diperoleh dari EventWaitHandle) |
| ToString() |
Mengembalikan string yang mewakili objek saat ini. (Diperoleh dari Object) |
| 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
Kelas ini aman untuk utas.
Lihat juga
- WaitHandle
-
Managed Threading - Gambaran umum primitif sinkronisasi