Assembly : mscorlib (dans mscorlib.dll)
SyntaxePublic Overridable Function WaitOne ( _ millisecondsTimeout As Integer, _ exitContext As Boolean _ ) As Boolean
Dim instance As WaitHandle Dim millisecondsTimeout As Integer Dim exitContext As Boolean Dim returnValue As Boolean returnValue = instance.WaitOne(millisecondsTimeout, exitContext)
public virtual bool WaitOne ( int millisecondsTimeout, bool exitContext )
public: virtual bool WaitOne ( int millisecondsTimeout, bool exitContext )
public boolean WaitOne ( int millisecondsTimeout, boolean exitContext )
public function WaitOne ( millisecondsTimeout : int, exitContext : boolean ) : boolean
Paramètres
- millisecondsTimeout
Nombre de millisecondes à attendre, ou Timeout.Infinite (-1) pour un délai d'attente infini.
- exitContext
true pour quitter le domaine de synchronisation du contexte avant l'attente (dans le cas d'un contexte synchronisé) et l'acquérir à nouveau ensuite ; sinon false.
Valeur de retour
true si l'instance en cours reçoit un signal ; sinon false.
Exceptions| Type d'exception | Condition |
|---|---|
| L'instance actuelle a déjà été supprimée. | |
| millisecondsTimeout est un nombre négatif autre que -1, qui représente un délai d'attente infini. | |
| 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 WaitOne retourne true lorsqu'un mutex est abandonné. Un mutex abandonné indique une erreur de codage grave. L'exception contient des informations utiles pour le débogage.
L'appelant de cette méthode bloque jusqu'à ce que l'instance en cours reçoive un signal ou qu'un dépassement de délai se produise. Utilisez cette méthode pour demander un blocage jusqu'à ce que WaitHandle reçoive un signal d'un autre thread, tel que celui qui est généré à l'achèvement d'une opération asynchrone. Pour plus d'informations, consultez l'interface IAsyncResult.
Substituez cette méthode pour personnaliser le comportement des classes dérivées.
Remarques sur la sortie de contexte
Le paramètre exitContext n'a aucun effet à moins que la méthode WaitOne ne soit appelée à partir d'un contexte managé non défini par défaut. Cela peut se produire si votre thread figure dans un appel à une instance d'une classe dérivée de ContextBoundObject. Même si vous exécutez actuellement une méthode sur une classe qui ne dérive pas de ContextBoundObject, comme String, vous pouvez être dans un contexte non défini par défaut si ContextBoundObject se trouve sur votre pile dans le domaine d'application en cours.
Lorsque votre code s'exécute dans un contexte non défini par défaut, l'affectation de true à exitContext provoque la sortie du thread du contexte managé non défini par défaut (à savoir, pour passer dans le contexte par défaut) avant l'exécution de la méthode WaitOne. Le thread retourne au contexte d'origine non défini par défaut après que l'appel de la méthode WaitOne est terminé.
Cela peut être utile lorsque la classe liée au contexte comporte l'attribut SynchronizationAttribute. Dans ce cas, tous les appels aux membres de la classe sont synchronisés automatiquement et le domaine de synchronisation est le corps du code de la classe. Si le code dans la pile des appels d'un membre appelle la méthode WaitOne et spécifie la valeur true pour exitContext, le thread quitte le domaine de synchronisation, ce qui permet à un thread qui est bloqué sur un appel à n'importe quel membre de l'objet de continuer. Lorsque la méthode WaitOne est retournée, le thread qui a effectué l'appel doit attendre pour rentrer dans le domaine de synchronisation.
ExempleL'exemple de code suivant montre comment utiliser un handle d'attente pour empêcher l'arrêt d'un processus pendant qu'il attend la fin de l'exécution d'un thread d'arrière-plan.
Imports System Imports System.Threading Public Class WaitOne Shared autoEvent As New AutoResetEvent(False) <MTAThread> _ Shared Sub Main() Console.WriteLine("Main starting.") ThreadPool.QueueUserWorkItem(AddressOf WorkMethod, autoEvent) ' Wait for work method to signal. If autoEvent.WaitOne(1000, False) Then Console.WriteLine("Work method signaled.") Else Console.WriteLine("Timed out waiting for work " & _ "method to signal.") End If Console.WriteLine("Main ending.") End Sub Shared Sub WorkMethod(stateInfo As Object) Console.WriteLine("Work starting.") ' Simulate time spent working. Thread.Sleep(New Random().Next(100, 2000)) ' Signal that work is finished. Console.WriteLine("Work ending.") CType(stateInfo, AutoResetEvent).Set() End Sub End Class
using System; using System.Threading; class WaitOne { static AutoResetEvent autoEvent = new AutoResetEvent(false); static void Main() { Console.WriteLine("Main starting."); ThreadPool.QueueUserWorkItem( new WaitCallback(WorkMethod), autoEvent); // Wait for work method to signal. if(autoEvent.WaitOne(1000, false)) { Console.WriteLine("Work method signaled."); } else { Console.WriteLine("Timed out waiting for work " + "method to signal."); } Console.WriteLine("Main ending."); } static void WorkMethod(object stateInfo) { Console.WriteLine("Work starting."); // Simulate time spent working. Thread.Sleep(new Random().Next(100, 2000)); // Signal that work is finished. Console.WriteLine("Work ending."); ((AutoResetEvent)stateInfo).Set(); } }
using namespace System; using namespace System::Threading; ref class WaitOne { private: WaitOne(){} public: static void WorkMethod( Object^ stateInfo ) { Console::WriteLine( "Work starting." ); // Simulate time spent working. Thread::Sleep( (gcnew Random)->Next( 100, 2000 ) ); // Signal that work is finished. Console::WriteLine( "Work ending." ); dynamic_cast<AutoResetEvent^>(stateInfo)->Set(); } }; int main() { Console::WriteLine( "Main starting." ); AutoResetEvent^ autoEvent = gcnew AutoResetEvent( false ); ThreadPool::QueueUserWorkItem( gcnew WaitCallback( &WaitOne::WorkMethod ), autoEvent ); // Wait for work method to signal. if ( autoEvent->WaitOne( 1000, false ) ) { Console::WriteLine( "Work method signaled." ); } else { Console::WriteLine( "Timed out waiting for work " "method to signal." ); } Console::WriteLine( "Main ending." ); }
import System.*; import System.Threading.*; import System.Threading.Thread; class WaitOne { private static AutoResetEvent autoEvent = new AutoResetEvent(false); public static void main(String[] args) { Console.WriteLine("Main starting."); ThreadPool.QueueUserWorkItem(new WaitCallback(WorkMethod), autoEvent); // Wait for work method to signal. if (autoEvent.WaitOne(1000, false)) { Console.WriteLine("Work method signaled."); } else { Console.WriteLine(("Timed out waiting for work " + "method to signal.")); } Console.WriteLine("Main ending."); } //main static void WorkMethod(Object stateInfo) { Console.WriteLine("Work starting."); // Simulate time spent working. Thread.Sleep((new Random()).Next(100, 2000)); // Signal that work is finished. Console.WriteLine("Work ending."); ((AutoResetEvent)(stateInfo)).Set(); } //WorkMethod } //WaitOne
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.
Outils (masquer)
S'enregistrer
Liste des Membres
Qui est en ligne?
FAQ