Assembly : mscorlib (dans mscorlib.dll)
SyntaxePublic Shared Function WaitAny ( _ waitHandles As WaitHandle() _ ) As Integer
Dim waitHandles As WaitHandle() Dim returnValue As Integer returnValue = WaitHandle.WaitAny(waitHandles)
public static int WaitAny ( WaitHandle[] waitHandles )
public: static int WaitAny ( array<WaitHandle^>^ waitHandles )
public static int WaitAny ( WaitHandle[] waitHandles )
public static function WaitAny ( waitHandles : WaitHandle[] ) : int
Paramètres
- waitHandles
Tableau WaitHandle qui contient les objets que l'instance en cours attendra.
Valeur de retour
Index du tableau de l'objet ayant respecté l'attente.
Exceptions| Type d'exception | Condition |
|---|---|
| Le paramètre waitHandles a la valeur référence Null (Nothing en Visual Basic) ou un ou plusieurs des objets du tableau waitHandles ont la valeur référence Null (Nothing en Visual Basic). | |
| Le nombre d'objets de waitHandles est supérieur à la limite autorisée par le système. | |
| waitHandles est un tableau qui ne contient aucun élément. | |
| L'attente est finie, car un thread a terminé son exécution sans libérer de mutex. Cette exception n'est pas levée dans Windows 98 ou Windows Millennium. |
NotesAbandonedMutexException est une nouveauté de la version 2.0 du .NET Framework. Dans les versions antérieures, la méthode WaitAny retourne true si l'attente se termine parce qu'un mutex a été abandonné. Un mutex abandonné indique une erreur de codage sérieuse. L'exception contient des informations utiles pour le débogage.
La méthode WaitAny lève une exception AbandonedMutexException uniquement lorsque l'attente se termine à cause d'un mutex abandonné. Si waitHandles contient un mutex libéré avec un numéro d'index inférieur à celui du mutex abandonné, la méthode WaitAny se termine normalement et l'exception n'est pas levée.
Remarque |
|---|
| Dans les versions du .NET Framework antérieures à la version 2.0, si un thread se termine ou s'interrompt sans libérer explicitement un Mutex, et que Mutex se trouve à l'index 0 (zéro) du tableau WaitAny d'un autre thread, l'index retourné par WaitAny est 128 au lieu de 0. |
Cette méthode effectue un retour lorsqu'un handle est signalé. Si plusieurs objets sont signalés pendant l'appel, la valeur de retour est l'index de tableau de l'objet signalé ayant la plus petite valeur d'index de tous. Dans certaines implémentations, si plus de 64 handles sont passés, NotSupportedException est levée.
L'appel de cette surcharge de méthode équivaut à appeler la surcharge de méthode WaitAny(WaitHandle[],Int32,Boolean) et à spécifier -1 (ou Timeout.Infinite) pour millisecondsTimeout et true pour exitContext.
ExempleL'exemple de code suivant illustre l'appel de la méthode WaitAny. Cet exemple de code fait partie d'un exemple plus développé fourni pour la classe WaitHandle.
<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
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); }
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); }
Plates-formesWindows 98, Windows 2000 SP4, Windows Millennium Edition, 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.
Remarque
Outils (masquer)
S'enregistrer
Liste des Membres
Qui est en ligne?
FAQ