Assembly : mscorlib (dans mscorlib.dll)
Syntaxe<ComVisibleAttribute(True)> _ Public MustInherit Class WaitHandle Inherits MarshalByRefObject Implements IDisposable
Dim instance As WaitHandle
[ComVisibleAttribute(true)] public abstract class WaitHandle : MarshalByRefObject, IDisposable
[ComVisibleAttribute(true)] public ref class WaitHandle abstract : public MarshalByRefObject, IDisposable
/** @attribute ComVisibleAttribute(true) */ public abstract class WaitHandle extends MarshalByRefObject implements IDisposable
ComVisibleAttribute(true) public abstract class WaitHandle extends MarshalByRefObject implements IDisposable
NotesCette classe est généralement utilisée comme classe de base des objets de synchronisation. Les classes dérivées de WaitHandle définissent un mécanisme de signalisation pour indiquer la capture ou la libération d'un accès à une ressource partagée, mais elles utilisent les méthodes WaitHandle héritées pour assurer le blocage pendant les attentes d'accès aux ressources partagées.
Utilisez les méthodes statiques de cette classe pour bloquer un thread tant qu'un ou plusieurs objets de synchronisation n'ont pas reçu de signal.
ExempleL'exemple de code suivant affiche la façon dont deux threads peuvent effectuer des tâches en arrière-plan pendant que le thread principal attend que les tâches prennent fin à l'aide des méthodes WaitAny et WaitAll statiques de la classe WaitHandle.
Imports System Imports System.Threading NotInheritable Public Class App ' Define an array with two AutoResetEvent WaitHandles. Private Shared waitHandles() As WaitHandle = _ {New AutoResetEvent(False), New AutoResetEvent(False)} ' Define a random number generator for testing. Private Shared r As New Random() <MTAThreadAttribute> _ Public Shared Sub Main() ' Queue two tasks on two different threads; ' wait until all tasks are completed. Dim dt As DateTime = DateTime.Now Console.WriteLine("Main thread is waiting for BOTH tasks to complete.") ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(0)) ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(1)) WaitHandle.WaitAll(waitHandles) ' The time shown below should match the longest task. Console.WriteLine("Both tasks are completed (time waited={0})", _ (DateTime.Now - dt).TotalMilliseconds) ' Queue up two tasks on two different threads; ' wait until any tasks are completed. dt = DateTime.Now Console.WriteLine() Console.WriteLine("The main thread is waiting for either task to complete.") ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(0)) ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(1)) Dim index As Integer = WaitHandle.WaitAny(waitHandles) ' The time shown below should match the shortest task. Console.WriteLine("Task {0} finished first (time waited={1}).", _ index + 1,(DateTime.Now - dt).TotalMilliseconds) End Sub 'Main Shared Sub DoTask(ByVal state As [Object]) Dim are As AutoResetEvent = CType(state, AutoResetEvent) Dim time As Integer = 1000 * r.Next(2, 10) Console.WriteLine("Performing a task for {0} milliseconds.", time) Thread.Sleep(time) are.Set() End Sub 'DoTask End Class 'App ' This code produces output similar to the following: ' ' Main thread is waiting for BOTH tasks to complete. ' Performing a task for 7000 milliseconds. ' Performing a task for 4000 milliseconds. ' Both tasks are completed (time waited=7064.8052) ' ' The main thread is waiting for either task to complete. ' Performing a task for 2000 milliseconds. ' Performing a task for 2000 milliseconds. ' Task 1 finished first (time waited=2000.6528).
using System; using System.Threading; public sealed class App { // Define an array with two AutoResetEvent WaitHandles. static WaitHandle[] waitHandles = new WaitHandle[] { new AutoResetEvent(false), new AutoResetEvent(false) }; // Define a random number generator for testing. static Random r = new Random(); static void Main() { // Queue up two tasks on two different threads; // wait until all tasks are completed. DateTime dt = DateTime.Now; Console.WriteLine("Main thread is waiting for BOTH tasks to complete."); ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]); ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]); WaitHandle.WaitAll(waitHandles); // The time shown below should match the longest task. Console.WriteLine("Both tasks are completed (time waited={0})", (DateTime.Now - dt).TotalMilliseconds); // Queue up two tasks on two different threads; // wait until any tasks are completed. dt = DateTime.Now; Console.WriteLine(); Console.WriteLine("The main thread is waiting for either task to complete."); ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]); ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]); int index = WaitHandle.WaitAny(waitHandles); // The time shown below should match the shortest task. Console.WriteLine("Task {0} finished first (time waited={1}).", index + 1, (DateTime.Now - dt).TotalMilliseconds); } static void DoTask(Object state) { AutoResetEvent are = (AutoResetEvent) state; int time = 1000 * r.Next(2, 10); Console.WriteLine("Performing a task for {0} milliseconds.", time); Thread.Sleep(time); are.Set(); } } // This code produces output similar to the following: // // Main thread is waiting for BOTH tasks to complete. // Performing a task for 7000 milliseconds. // Performing a task for 4000 milliseconds. // Both tasks are completed (time waited=7064.8052) // // The main thread is waiting for either task to complete. // Performing a task for 2000 milliseconds. // Performing a task for 2000 milliseconds. // Task 1 finished first (time waited=2000.6528).
using namespace System; using namespace System::Threading; public ref class WaitHandleExample { // Define a random number generator for testing. private: static Random^ random = gcnew Random(); public: static void DoTask(Object^ state) { AutoResetEvent^ autoReset = (AutoResetEvent^) state; int time = 1000 * random->Next(2, 10); Console::WriteLine("Performing a task for {0} milliseconds.", time); Thread::Sleep(time); autoReset->Set(); } }; int main() { // Define an array with two AutoResetEvent WaitHandles. array<WaitHandle^>^ handles = gcnew array<WaitHandle^> { gcnew AutoResetEvent(false), gcnew AutoResetEvent(false)}; // Queue up two tasks on two different threads; // wait until all tasks are completed. DateTime timeInstance = DateTime::Now; Console::WriteLine("Main thread is waiting for BOTH tasks to " + "complete."); ThreadPool::QueueUserWorkItem( gcnew WaitCallback(WaitHandleExample::DoTask), handles[0]); ThreadPool::QueueUserWorkItem( gcnew WaitCallback(WaitHandleExample::DoTask), handles[1]); WaitHandle::WaitAll(handles); // The time shown below should match the longest task. Console::WriteLine("Both tasks are completed (time waited={0})", (DateTime::Now - timeInstance).TotalMilliseconds); // Queue up two tasks on two different threads; // wait until any tasks are completed. timeInstance = DateTime::Now; Console::WriteLine(); Console::WriteLine("The main thread is waiting for either task to " + "complete."); ThreadPool::QueueUserWorkItem( gcnew WaitCallback(WaitHandleExample::DoTask), handles[0]); ThreadPool::QueueUserWorkItem( gcnew WaitCallback(WaitHandleExample::DoTask), handles[1]); int index = WaitHandle::WaitAny(handles); // The time shown below should match the shortest task. Console::WriteLine("Task {0} finished first (time waited={1}).", index + 1, (DateTime::Now - timeInstance).TotalMilliseconds); } // This code produces the following sample output. // // Main thread is waiting for BOTH tasks to complete. // Performing a task for 7000 milliseconds. // Performing a task for 4000 milliseconds. // Both tasks are completed (time waited=7064.8052) // The main thread is waiting for either task to complete. // Performing a task for 2000 milliseconds. // Performing a task for 2000 milliseconds. // Task 1 finished first (time waited=2000.6528).
Hiérarchie d'héritageSystem.MarshalByRefObject
System.Threading.WaitHandle
System.Threading.EventWaitHandle
System.Threading.Mutex
System.Threading.Semaphore
Plates-formesWindows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile pour Pocket PC, Windows Mobile pour Smartphone, Windows Server 2003, Windows XP Édition Media Center, Windows XP Professionnel Édition x64, Windows XP SP2, Windows XP Starter Edition
Le .NET Framework ne prend pas en charge toutes les versions de chaque plate-forme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise.
Informations de version
Outils (masquer)
S'enregistrer
Liste des Membres
Qui est en ligne?
FAQ