WaitHandle.WaitOne WaitHandle.WaitOne WaitHandle.WaitOne WaitHandle.WaitOne Method

Definición

Bloquea el subproceso actual hasta que el objeto WaitHandle actual recibe una señal.Blocks the current thread until the current WaitHandle receives a signal.

Sobrecargas

WaitOne() WaitOne() WaitOne() WaitOne()

Bloquea el subproceso actual hasta que el objeto WaitHandle actual recibe una señal.Blocks the current thread until the current WaitHandle receives a signal.

WaitOne(Int32) WaitOne(Int32) WaitOne(Int32) WaitOne(Int32)

Bloquea el subproceso actual hasta que el objeto WaitHandle actual recibe una señal, usando un entero de 32 bits con signo para especificar el intervalo de tiempo en milisegundos.Blocks the current thread until the current WaitHandle receives a signal, using a 32-bit signed integer to specify the time interval in milliseconds.

WaitOne(TimeSpan) WaitOne(TimeSpan) WaitOne(TimeSpan) WaitOne(TimeSpan)

Bloquea el subproceso actual hasta que la instancia actual recibe una señal, usando TimeSpan para especificar el intervalo de tiempo.Blocks the current thread until the current instance receives a signal, using a TimeSpan to specify the time interval.

WaitOne(Int32, Boolean) WaitOne(Int32, Boolean) WaitOne(Int32, Boolean) WaitOne(Int32, Boolean)

Bloquea el subproceso actual hasta que el objeto WaitHandle actual recibe una señal, usa un entero de 32 bits con signo para determinar el intervalo de tiempo y especifica si hay que salir del dominio de sincronización antes de la espera.Blocks the current thread until the current WaitHandle receives a signal, using a 32-bit signed integer to specify the time interval and specifying whether to exit the synchronization domain before the wait.

WaitOne(TimeSpan, Boolean) WaitOne(TimeSpan, Boolean) WaitOne(TimeSpan, Boolean) WaitOne(TimeSpan, Boolean)

Bloquea el subproceso actual hasta que la instancia actual recibe una señal; usa TimeSpan para determinar el intervalo de tiempo y especifica si hay que abandonar el dominio de sincronización antes de la espera.Blocks the current thread until the current instance receives a signal, using a TimeSpan to specify the time interval and specifying whether to exit the synchronization domain before the wait.

WaitOne() WaitOne() WaitOne() WaitOne()

Bloquea el subproceso actual hasta que el objeto WaitHandle actual recibe una señal.Blocks the current thread until the current WaitHandle receives a signal.

public:
 virtual bool WaitOne();
public virtual bool WaitOne ();
abstract member WaitOne : unit -> bool
override this.WaitOne : unit -> bool
Public Overridable Function WaitOne () As Boolean

Devoluciones

Es true si la instancia actual recibe una señal.true if the current instance receives a signal. Si nunca se señala a la instancia actual, WaitOne(Int32, Boolean) nunca devuelve nada.If the current instance is never signaled, WaitOne(Int32, Boolean) never returns.

Excepciones

Ya se ha eliminado la instancia actual.The current instance has already been disposed.

La espera finalizó porque un subproceso se cierra sin liberar una exclusión mutua.The wait completed because a thread exited without releasing a mutex. Esta excepción no se produce en Windows 98 o en Windows Millennium Edition.This exception is not thrown on Windows 98 or Windows Millennium Edition.

La instancia actual es un proxy transparente para un objeto WaitHandle en otro dominio de aplicación.The current instance is a transparent proxy for a WaitHandle in another application domain.

Ejemplos

El ejemplo de código siguiente muestra cómo usar un identificador de espera para impedir que un proceso de terminación mientras espera a que termine de ejecutarse un subproceso en segundo plano.The following code example shows how to use a wait handle to keep a process from terminating while it waits for a background thread to finish executing.

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.
   autoEvent->WaitOne(  );
   Console::WriteLine( "Work method signaled.\nMain ending." );
}

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.
        autoEvent.WaitOne();
        Console.WriteLine("Work method signaled.\nMain 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();
    }
}
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.
        autoEvent.WaitOne()
        Console.WriteLine("Work method signaled.")
        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

Comentarios

AbandonedMutexException Novedades de la versión 2.0 de .NET Framework.AbandonedMutexException is new in the .NET Framework version 2.0. En versiones anteriores, el WaitOne devuelve del método true cuando se abandona una exclusión mutua.In previous versions, the WaitOne method returns true when a mutex is abandoned. A menudo, una exclusión mutua abandonada indica un error grave de codificación.An abandoned mutex often indicates a serious coding error. En el caso de una exclusión mutua todo el sistema, podría indicar que una aplicación ha finalizado abruptamente (por ejemplo, mediante el Administrador de tareas de Windows).In the case of a system-wide mutex, it might indicate that an application has been terminated abruptly (for example, by using Windows Task Manager). La excepción contiene información útil para la depuración.The exception contains information useful for debugging.

El llamador de este método se bloquea indefinidamente hasta que la instancia actual recibe una señal.The caller of this method blocks indefinitely until the current instance receives a signal. Utilice este método para bloquear hasta que un WaitHandle recibe una señal de otro subproceso, como se genera cuando se completa una operación asincrónica.Use this method to block until a WaitHandle receives a signal from another thread, such as is generated when an asynchronous operation completes. Para obtener más información, consulte el IAsyncResult interfaz.For more information, see the IAsyncResult interface.

Llamar a esta sobrecarga del método es equivalente a llamar a la WaitOne(Int32, Boolean) sobrecarga del método y especificar -1 o Timeout.Infinite para el primer parámetro y false para el segundo parámetro.Calling this method overload is equivalent to calling the WaitOne(Int32, Boolean) method overload and specifying -1 or Timeout.Infinite for the first parameter and false for the second parameter.

Invalide este método para personalizar el comportamiento de las clases derivadas.Override this method to customize the behavior of derived classes.

WaitOne(Int32) WaitOne(Int32) WaitOne(Int32) WaitOne(Int32)

Bloquea el subproceso actual hasta que el objeto WaitHandle actual recibe una señal, usando un entero de 32 bits con signo para especificar el intervalo de tiempo en milisegundos.Blocks the current thread until the current WaitHandle receives a signal, using a 32-bit signed integer to specify the time interval in milliseconds.

public:
 virtual bool WaitOne(int millisecondsTimeout);
public virtual bool WaitOne (int millisecondsTimeout);
abstract member WaitOne : int -> bool
override this.WaitOne : int -> bool
Public Overridable Function WaitOne (millisecondsTimeout As Integer) As Boolean

Parámetros

millisecondsTimeout
Int32 Int32 Int32 Int32

Número de milisegundos de espera o Infinite (-1) para esperar indefinidamente.The number of milliseconds to wait, or Infinite (-1) to wait indefinitely.

Devoluciones

true si la instancia actual recibe una señal; en caso contrario, false.true if the current instance receives a signal; otherwise, false.

Excepciones

Ya se ha eliminado la instancia actual.The current instance has already been disposed.

millisecondsTimeout es un número negativo distinto de-1, que representa un tiempo de espera infinito.millisecondsTimeout is a negative number other than -1, which represents an infinite time-out.

La espera finalizó porque un subproceso se cierra sin liberar una exclusión mutua.The wait completed because a thread exited without releasing a mutex. Esta excepción no se produce en Windows 98 o en Windows Millennium Edition.This exception is not thrown on Windows 98 or Windows Millennium Edition.

La instancia actual es un proxy transparente para un objeto WaitHandle en otro dominio de aplicación.The current instance is a transparent proxy for a WaitHandle in another application domain.

Ejemplos

El ejemplo de código siguiente muestra cómo usar un identificador de espera para impedir que un proceso de terminación mientras espera a que termine de ejecutarse un subproceso en segundo plano.The following code example shows how to use a wait handle to keep a process from terminating while it waits for a background thread to finish executing.

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 ) )
   {
      Console::WriteLine( "Work method signaled." );
   }
   else
   {
      Console::WriteLine( "Timed out waiting for work "
      "method to signal." );
   }

   Console::WriteLine( "Main ending." );
}

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))
        {
            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();
    }
}
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) 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

Comentarios

Si millisecondsTimeout es cero, el método no se bloquea.If millisecondsTimeout is zero, the method does not block. Comprueba el estado del identificador de espera y vuelve inmediatamente.It tests the state of the wait handle and returns immediately.

Se produce el llamador de este método se bloquea hasta que la instancia actual recibe una señal o un tiempo de espera.The caller of this method blocks until the current instance receives a signal or a time-out occurs. Utilice este método para bloquear hasta que un WaitHandle recibe una señal de otro subproceso, como se genera cuando se completa una operación asincrónica.Use this method to block until a WaitHandle receives a signal from another thread, such as is generated when an asynchronous operation completes. Para obtener más información, consulte el IAsyncResult interfaz.For more information, see the IAsyncResult interface.

Invalide este método para personalizar el comportamiento de las clases derivadas.Override this method to customize the behavior of derived classes.

Llamar a esta sobrecarga del método es igual que llamar a la WaitOne(Int32, Boolean) sobrecarga y especificando false para exitContext.Calling this method overload is the same as calling the WaitOne(Int32, Boolean) overload and specifying false for exitContext.

WaitOne(TimeSpan) WaitOne(TimeSpan) WaitOne(TimeSpan) WaitOne(TimeSpan)

Bloquea el subproceso actual hasta que la instancia actual recibe una señal, usando TimeSpan para especificar el intervalo de tiempo.Blocks the current thread until the current instance receives a signal, using a TimeSpan to specify the time interval.

public:
 virtual bool WaitOne(TimeSpan timeout);
public virtual bool WaitOne (TimeSpan timeout);
abstract member WaitOne : TimeSpan -> bool
override this.WaitOne : TimeSpan -> bool
Public Overridable Function WaitOne (timeout As TimeSpan) As Boolean

Parámetros

timeout
TimeSpan TimeSpan TimeSpan TimeSpan

Estructura TimeSpan que representa el número de milisegundos de espera o estructura TimeSpan que representa -1 milisegundos para esperar indefinidamente.A TimeSpan that represents the number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely.

Devoluciones

true si la instancia actual recibe una señal; en caso contrario, false.true if the current instance receives a signal; otherwise, false.

Excepciones

Ya se ha eliminado la instancia actual.The current instance has already been disposed.

timeout es un número negativo distinto de -1 milisegundos, que representa un tiempo de espera infinito.timeout is a negative number other than -1 milliseconds, which represents an infinite time-out. O bien-or- timeout es mayor que MaxValue.timeout is greater than MaxValue.

La espera finalizó porque un subproceso se cierra sin liberar una exclusión mutua.The wait completed because a thread exited without releasing a mutex. Esta excepción no se produce en Windows 98 o en Windows Millennium Edition.This exception is not thrown on Windows 98 or Windows Millennium Edition.

La instancia actual es un proxy transparente para un objeto WaitHandle en otro dominio de aplicación.The current instance is a transparent proxy for a WaitHandle in another application domain.

Comentarios

Si timeout es cero, el método no se bloquea.If timeout is zero, the method does not block. Comprueba el estado del identificador de espera y vuelve inmediatamente.It tests the state of the wait handle and returns immediately.

Se produce el llamador de este método se bloquea hasta que la instancia actual recibe una señal o un tiempo de espera.The caller of this method blocks until the current instance receives a signal or a time-out occurs. Utilice este método para bloquear hasta que un WaitHandle recibe una señal de otro subproceso, como se genera cuando se completa una operación asincrónica.Use this method to block until a WaitHandle receives a signal from another thread, such as is generated when an asynchronous operation completes. Para obtener más información, consulte el IAsyncResult interfaz.For more information, see the IAsyncResult interface.

Invalide este método para personalizar el comportamiento de las clases derivadas.Override this method to customize the behavior of derived classes.

El valor máximo de timeout es Int32.MaxValue.The maximum value for timeout is Int32.MaxValue.

Llamar a esta sobrecarga del método es igual que llamar a la WaitOne(TimeSpan, Boolean) sobrecarga y especificando false para exitContext.Calling this method overload is the same as calling the WaitOne(TimeSpan, Boolean) overload and specifying false for exitContext.

WaitOne(Int32, Boolean) WaitOne(Int32, Boolean) WaitOne(Int32, Boolean) WaitOne(Int32, Boolean)

Bloquea el subproceso actual hasta que el objeto WaitHandle actual recibe una señal, usa un entero de 32 bits con signo para determinar el intervalo de tiempo y especifica si hay que salir del dominio de sincronización antes de la espera.Blocks the current thread until the current WaitHandle receives a signal, using a 32-bit signed integer to specify the time interval and specifying whether to exit the synchronization domain before the wait.

public:
 virtual bool WaitOne(int millisecondsTimeout, bool exitContext);
public virtual bool WaitOne (int millisecondsTimeout, bool exitContext);
abstract member WaitOne : int * bool -> bool
override this.WaitOne : int * bool -> bool
Public Overridable Function WaitOne (millisecondsTimeout As Integer, exitContext As Boolean) As Boolean

Parámetros

millisecondsTimeout
Int32 Int32 Int32 Int32

Número de milisegundos de espera o Infinite (-1) para esperar indefinidamente.The number of milliseconds to wait, or Infinite (-1) to wait indefinitely.

exitContext
Boolean Boolean Boolean Boolean

true para salir del dominio de sincronización del contexto antes de la espera (en caso de encontrarse en un contexto sincronizado) y volver a adquirirlo más tarde; de lo contrario, false.true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it afterward; otherwise, false.

Devoluciones

true si la instancia actual recibe una señal; en caso contrario, false.true if the current instance receives a signal; otherwise, false.

Excepciones

Ya se ha eliminado la instancia actual.The current instance has already been disposed.

millisecondsTimeout es un número negativo distinto de-1, que representa un tiempo de espera infinito.millisecondsTimeout is a negative number other than -1, which represents an infinite time-out.

La espera finalizó porque un subproceso se cierra sin liberar una exclusión mutua.The wait completed because a thread exited without releasing a mutex. Esta excepción no se produce en Windows 98 o en Windows Millennium Edition.This exception is not thrown on Windows 98 or Windows Millennium Edition.

La instancia actual es un proxy transparente para un objeto WaitHandle en otro dominio de aplicación.The current instance is a transparent proxy for a WaitHandle in another application domain.

Ejemplos

El ejemplo siguiente se muestra cómo el WaitOne(Int32, Boolean) sobrecarga del método se comporta cuando se llama dentro de un dominio de sincronización.The following example shows how the WaitOne(Int32, Boolean) method overload behaves when it is called within a synchronization domain. En primer lugar, espera a que un subproceso con exitContext establecido en false y se bloquea hasta que expira el tiempo de espera de la espera.First, a thread waits with exitContext set to false and blocks until the wait timeout expires. Un segundo subproceso se ejecuta después de que el primer subproceso finaliza y espera a que con exitContext establecido en true.A second thread executes after the first thread terminates and waits with exitContext set to true. La llamada para indicar el identificador de espera para este segundo subproceso no está bloqueada y finaliza el subproceso antes de la espera.The call to signal the wait handle for this second thread is not blocked, and the thread completes before the wait timeout.

using namespace System;
using namespace System::Threading;
using namespace System::Runtime::Remoting::Contexts;

[Synchronization(true)]
public ref class SyncingClass : ContextBoundObject
{
private:
    EventWaitHandle^ waitHandle;

public:
    SyncingClass()
    {
         waitHandle =
            gcnew EventWaitHandle(false, EventResetMode::ManualReset);
    }

    void Signal()
    {
        Console::WriteLine("Thread[{0:d4}]: Signalling...", Thread::CurrentThread->GetHashCode());
        waitHandle->Set();
    }

    void DoWait(bool leaveContext)
    {
        bool signalled;

        waitHandle->Reset();
        Console::WriteLine("Thread[{0:d4}]: Waiting...", Thread::CurrentThread->GetHashCode());
        signalled = waitHandle->WaitOne(3000, leaveContext);
        if (signalled)
        {
            Console::WriteLine("Thread[{0:d4}]: Wait released!!!", Thread::CurrentThread->GetHashCode());
        }
        else
        {
            Console::WriteLine("Thread[{0:d4}]: Wait timeout!!!", Thread::CurrentThread->GetHashCode());
        }
    }
};

public ref class TestSyncDomainWait
{
public:
    static void Main()
    {
        SyncingClass^ syncClass = gcnew SyncingClass();

        Thread^ runWaiter;

        Console::WriteLine("\nWait and signal INSIDE synchronization domain:\n");
        runWaiter = gcnew Thread(gcnew ParameterizedThreadStart(&TestSyncDomainWait::RunWaitKeepContext));
        runWaiter->Start(syncClass);
        Thread::Sleep(1000);
        Console::WriteLine("Thread[{0:d4}]: Signal...", Thread::CurrentThread->GetHashCode());
        // This call to Signal will block until the timeout in DoWait expires.
        syncClass->Signal();
        runWaiter->Join();

        Console::WriteLine("\nWait and signal OUTSIDE synchronization domain:\n");
        runWaiter = gcnew Thread(gcnew ParameterizedThreadStart(&TestSyncDomainWait::RunWaitLeaveContext));
        runWaiter->Start(syncClass);
        Thread::Sleep(1000);
        Console::WriteLine("Thread[{0:d4}]: Signal...", Thread::CurrentThread->GetHashCode());
        // This call to Signal is unblocked and will set the wait handle to
        // release the waiting thread.
        syncClass->Signal();
        runWaiter->Join();
    }

    static void RunWaitKeepContext(Object^ parm)
    {
        ((SyncingClass^)parm)->DoWait(false);
    }

    static void RunWaitLeaveContext(Object^ parm)
    {
        ((SyncingClass^)parm)->DoWait(true);
    }
};

int main()
{
    TestSyncDomainWait::Main();
}
// The output for the example program will be similar to the following:
//
// Wait and signal INSIDE synchronization domain:
//
// Thread[0004]: Waiting...
// Thread[0001]: Signal...
// Thread[0004]: Wait timeout!!!
// Thread[0001]: Signalling...
//
// Wait and signal OUTSIDE synchronization domain:
//
// Thread[0006]: Waiting...
// Thread[0001]: Signal...
// Thread[0001]: Signalling...
// Thread[0006]: Wait released!!!
using System;
using System.Threading;
using System.Runtime.Remoting.Contexts;

[Synchronization(true)]
public class SyncingClass : ContextBoundObject
{
    private EventWaitHandle waitHandle;

    public SyncingClass()
    {
         waitHandle =
            new EventWaitHandle(false, EventResetMode.ManualReset);
    }

    public void Signal()
    {
        Console.WriteLine("Thread[{0:d4}]: Signalling...", Thread.CurrentThread.GetHashCode());
        waitHandle.Set();
    }

    public void DoWait(bool leaveContext)
    {
        bool signalled;

        waitHandle.Reset();
        Console.WriteLine("Thread[{0:d4}]: Waiting...", Thread.CurrentThread.GetHashCode());
        signalled = waitHandle.WaitOne(3000, leaveContext);
        if (signalled)
        {
            Console.WriteLine("Thread[{0:d4}]: Wait released!!!", Thread.CurrentThread.GetHashCode());
        }
        else
        {
            Console.WriteLine("Thread[{0:d4}]: Wait timeout!!!", Thread.CurrentThread.GetHashCode());
        }
    }
}

public class TestSyncDomainWait
{
    public static void Main()
    {
        SyncingClass syncClass = new SyncingClass();

        Thread runWaiter;

        Console.WriteLine("\nWait and signal INSIDE synchronization domain:\n");
        runWaiter = new Thread(RunWaitKeepContext);
        runWaiter.Start(syncClass);
        Thread.Sleep(1000);
        Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode());
        // This call to Signal will block until the timeout in DoWait expires.
        syncClass.Signal();
        runWaiter.Join();

        Console.WriteLine("\nWait and signal OUTSIDE synchronization domain:\n");
        runWaiter = new Thread(RunWaitLeaveContext);
        runWaiter.Start(syncClass);
        Thread.Sleep(1000);
        Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode());
        // This call to Signal is unblocked and will set the wait handle to
        // release the waiting thread.
        syncClass.Signal();
        runWaiter.Join();
    }

    public static void RunWaitKeepContext(object parm)
    {
        ((SyncingClass)parm).DoWait(false);
    }

    public static void RunWaitLeaveContext(object parm)
    {
        ((SyncingClass)parm).DoWait(true);
    }
}

// The output for the example program will be similar to the following:
//
// Wait and signal INSIDE synchronization domain:
//
// Thread[0004]: Waiting...
// Thread[0001]: Signal...
// Thread[0004]: Wait timeout!!!
// Thread[0001]: Signalling...
//
// Wait and signal OUTSIDE synchronization domain:
//
// Thread[0006]: Waiting...
// Thread[0001]: Signal...
// Thread[0001]: Signalling...
// Thread[0006]: Wait released!!!
Imports System
Imports System.Threading
Imports System.Runtime.Remoting.Contexts

<Synchronization(true)>
Public Class SyncingClass
    Inherits ContextBoundObject
    
    Private waitHandle As EventWaitHandle

    Public Sub New()
         waitHandle = New EventWaitHandle(false, EventResetMode.ManualReset)
    End Sub

    Public Sub Signal()
        Console.WriteLine("Thread[{0:d4}]: Signalling...", Thread.CurrentThread.GetHashCode())
        waitHandle.Set()
    End Sub

    Public Sub DoWait(leaveContext As Boolean)
        Dim signalled As Boolean

        waitHandle.Reset()
        Console.WriteLine("Thread[{0:d4}]: Waiting...", Thread.CurrentThread.GetHashCode())
        signalled = waitHandle.WaitOne(3000, leaveContext)
        If signalled Then
            Console.WriteLine("Thread[{0:d4}]: Wait released!!!", Thread.CurrentThread.GetHashCode())
        Else
            Console.WriteLine("Thread[{0:d4}]: Wait timeout!!!", Thread.CurrentThread.GetHashCode())
        End If
    End Sub
End Class

Public Class TestSyncDomainWait
    Public Shared Sub Main()
        Dim syncClass As New SyncingClass()

        Dim runWaiter As Thread

        Console.WriteLine(vbNewLine + "Wait and signal INSIDE synchronization domain:" + vbNewLine)
        runWaiter = New Thread(AddressOf RunWaitKeepContext)
        runWaiter.Start(syncClass)
        Thread.Sleep(1000)
        Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode())
        ' This call to Signal will block until the timeout in DoWait expires.
        syncClass.Signal()
        runWaiter.Join()

        Console.WriteLine(vbNewLine + "Wait and signal OUTSIDE synchronization domain:" + vbNewLine)
        runWaiter = New Thread(AddressOf RunWaitLeaveContext)
        runWaiter.Start(syncClass)
        Thread.Sleep(1000)
        Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode())
        ' This call to Signal is unblocked and will set the wait handle to
        ' release the waiting thread.
        syncClass.Signal()
        runWaiter.Join()
    End Sub

    Public Shared Sub RunWaitKeepContext(parm As Object)
        Dim syncClass As SyncingClass = CType(parm, SyncingClass)
        syncClass.DoWait(False)
    End Sub

    Public Shared Sub RunWaitLeaveContext(parm As Object)
        Dim syncClass As SyncingClass = CType(parm, SyncingClass)
        syncClass.DoWait(True)
    End Sub
End Class

' The output for the example program will be similar to the following:
'
' Wait and signal INSIDE synchronization domain:
'
' Thread[0004]: Waiting...
' Thread[0001]: Signal...
' Thread[0004]: Wait timeout!!!
' Thread[0001]: Signalling...
'
' Wait and signal OUTSIDE synchronization domain:
'
' Thread[0006]: Waiting...
' Thread[0001]: Signal...
' Thread[0001]: Signalling...
' Thread[0006]: Wait released!!!

Comentarios

Si millisecondsTimeout es cero, el método no se bloquea.If millisecondsTimeout is zero, the method does not block. Comprueba el estado del identificador de espera y vuelve inmediatamente.It tests the state of the wait handle and returns immediately.

AbandonedMutexException Novedades de la versión 2.0 de .NET Framework.AbandonedMutexException is new in the .NET Framework version 2.0. En versiones anteriores, el WaitOne devuelve del método true cuando se abandona una exclusión mutua.In previous versions, the WaitOne method returns true when a mutex is abandoned. A menudo, una exclusión mutua abandonada indica un error grave de codificación.An abandoned mutex often indicates a serious coding error. En el caso de una exclusión mutua todo el sistema, podría indicar que una aplicación ha finalizado abruptamente (por ejemplo, mediante el Administrador de tareas de Windows).In the case of a system-wide mutex, it might indicate that an application has been terminated abruptly (for example, by using Windows Task Manager). La excepción contiene información útil para la depuración.The exception contains information useful for debugging.

Se produce el llamador de este método se bloquea hasta que la instancia actual recibe una señal o un tiempo de espera.The caller of this method blocks until the current instance receives a signal or a time-out occurs. Utilice este método para bloquear hasta que un WaitHandle recibe una señal de otro subproceso, como se genera cuando se completa una operación asincrónica.Use this method to block until a WaitHandle receives a signal from another thread, such as is generated when an asynchronous operation completes. Para obtener más información, consulte el IAsyncResult interfaz.For more information, see the IAsyncResult interface.

Invalide este método para personalizar el comportamiento de las clases derivadas.Override this method to customize the behavior of derived classes.

Notas sobre la salida del contextoNotes on Exiting the Context

El exitContext parámetro no tiene ningún efecto a menos que el WaitOne método se llama desde dentro de un contexto administrado no predeterminado.The exitContext parameter has no effect unless the WaitOne method is called from inside a nondefault managed context. Esto puede ocurrir si el subproceso está dentro de una llamada a una instancia de una clase derivada de ContextBoundObject.This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Incluso si se están ejecutando un método en una clase que no se deriva de ContextBoundObject, como String, puede estar en un contexto no predeterminado si un ContextBoundObject en la pila en el dominio de aplicación actual.Even if you are currently executing a method on a class that does not derive from ContextBoundObject, like String, you can be in a nondefault context if a ContextBoundObject is on your stack in the current application domain.

Cuando el código se ejecuta en un contexto no predeterminado, especificar true para exitContext hace que el subproceso salga del contexto administrado no predeterminado (es decir, para realizar la transición al contexto predeterminado) antes de ejecutar el WaitOne método.When your code is executing in a nondefault context, specifying true for exitContext causes the thread to exit the nondefault managed context (that is, to transition to the default context) before executing the WaitOne method. El subproceso vuelve al contexto original no predeterminado después de llamar a la WaitOne método se completa.The thread returns to the original nondefault context after the call to the WaitOne method completes.

Esto puede ser útil cuando la clase de contexto enlazado tiene SynchronizationAttribute.This can be useful when the context-bound class has SynchronizationAttribute. En ese caso, todas las llamadas a miembros de la clase se sincronizan automáticamente y el dominio de sincronización es todo el cuerpo de código para la clase.In that case, all calls to members of the class are automatically synchronized, and the synchronization domain is the entire body of code for the class. Si llama código en la pila de llamadas de un miembro de la WaitOne método y especifica true para exitContext, el subproceso sale del dominio de sincronización, lo que permite un subproceso que esté bloqueado en una llamada a cualquier miembro del objeto para continuar.If code in the call stack of a member calls the WaitOne method and specifies true for exitContext, the thread exits the synchronization domain, allowing a thread that is blocked on a call to any member of the object to proceed. Cuando el WaitOne método finaliza, el subproceso que realizó la llamada debe esperar para volver a escribir el dominio de sincronización.When the WaitOne method returns, the thread that made the call must wait to reenter the synchronization domain.

WaitOne(TimeSpan, Boolean) WaitOne(TimeSpan, Boolean) WaitOne(TimeSpan, Boolean) WaitOne(TimeSpan, Boolean)

Bloquea el subproceso actual hasta que la instancia actual recibe una señal; usa TimeSpan para determinar el intervalo de tiempo y especifica si hay que abandonar el dominio de sincronización antes de la espera.Blocks the current thread until the current instance receives a signal, using a TimeSpan to specify the time interval and specifying whether to exit the synchronization domain before the wait.

public:
 virtual bool WaitOne(TimeSpan timeout, bool exitContext);
public virtual bool WaitOne (TimeSpan timeout, bool exitContext);
abstract member WaitOne : TimeSpan * bool -> bool
override this.WaitOne : TimeSpan * bool -> bool
Public Overridable Function WaitOne (timeout As TimeSpan, exitContext As Boolean) As Boolean

Parámetros

timeout
TimeSpan TimeSpan TimeSpan TimeSpan

Estructura TimeSpan que representa el número de milisegundos de espera o estructura TimeSpan que representa -1 milisegundos para esperar indefinidamente.A TimeSpan that represents the number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely.

exitContext
Boolean Boolean Boolean Boolean

true para salir del dominio de sincronización del contexto antes de la espera (en caso de encontrarse en un contexto sincronizado) y volver a adquirirlo más tarde; de lo contrario, false.true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it afterward; otherwise, false.

Devoluciones

true si la instancia actual recibe una señal; en caso contrario, false.true if the current instance receives a signal; otherwise, false.

Excepciones

Ya se ha eliminado la instancia actual.The current instance has already been disposed.

timeout es un número negativo distinto de -1 milisegundos, que representa un tiempo de espera infinito.timeout is a negative number other than -1 milliseconds, which represents an infinite time-out. O bien-or- timeout es mayor que MaxValue.timeout is greater than MaxValue.

La espera finalizó porque un subproceso se cierra sin liberar una exclusión mutua.The wait completed because a thread exited without releasing a mutex. Esta excepción no se produce en Windows 98 o en Windows Millennium Edition.This exception is not thrown on Windows 98 or Windows Millennium Edition.

La instancia actual es un proxy transparente para un objeto WaitHandle en otro dominio de aplicación.The current instance is a transparent proxy for a WaitHandle in another application domain.

Ejemplos

El ejemplo de código siguiente muestra cómo usar un identificador de espera para impedir que un proceso de terminación mientras espera a que termine de ejecutarse un subproceso en segundo plano.The following code example shows how to use a wait handle to keep a process from terminating while it waits for a background thread to finish executing.

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( TimeSpan(0,0,1), false ) )
   {
      Console::WriteLine( "Work method signaled." );
   }
   else
   {
      Console::WriteLine( "Timed out waiting for work "
      "method to signal." );
   }

   Console::WriteLine( "Main ending." );
}

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(new TimeSpan(0, 0, 1), 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();
    }
}
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(New TimeSpan(0, 0, 1), 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

Comentarios

Si timeout es cero, el método no se bloquea.If timeout is zero, the method does not block. Comprueba el estado del identificador de espera y vuelve inmediatamente.It tests the state of the wait handle and returns immediately.

AbandonedMutexException Novedades de la versión 2.0 de .NET Framework.AbandonedMutexException is new in the .NET Framework version 2.0. En versiones anteriores, el WaitOne devuelve del método true cuando se abandona una exclusión mutua.In previous versions, the WaitOne method returns true when a mutex is abandoned. A menudo, una exclusión mutua abandonada indica un error grave de codificación.An abandoned mutex often indicates a serious coding error. En el caso de una exclusión mutua todo el sistema, podría indicar que una aplicación ha finalizado abruptamente (por ejemplo, mediante el Administrador de tareas de Windows).In the case of a system-wide mutex, it might indicate that an application has been terminated abruptly (for example, by using Windows Task Manager). La excepción contiene información útil para la depuración.The exception contains information useful for debugging.

Se produce el llamador de este método se bloquea hasta que la instancia actual recibe una señal o un tiempo de espera.The caller of this method blocks until the current instance receives a signal or a time-out occurs. Utilice este método para bloquear hasta que un WaitHandle recibe una señal de otro subproceso, como se genera cuando se completa una operación asincrónica.Use this method to block until a WaitHandle receives a signal from another thread, such as is generated when an asynchronous operation completes. Para obtener más información, consulte el IAsyncResult interfaz.For more information, see the IAsyncResult interface.

Invalide este método para personalizar el comportamiento de las clases derivadas.Override this method to customize the behavior of derived classes.

El valor máximo de timeout es Int32.MaxValue.The maximum value for timeout is Int32.MaxValue.

Notas sobre la salida del contextoNotes on Exiting the Context

El exitContext parámetro no tiene ningún efecto a menos que el WaitOne método se llama desde dentro de un contexto administrado no predeterminado.The exitContext parameter has no effect unless the WaitOne method is called from inside a nondefault managed context. Esto puede ocurrir si el subproceso está dentro de una llamada a una instancia de una clase derivada de ContextBoundObject.This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Incluso si se están ejecutando un método en una clase que no se deriva de ContextBoundObject, como String, puede estar en un contexto no predeterminado si un ContextBoundObject en la pila en el dominio de aplicación actual.Even if you are currently executing a method on a class that does not derive from ContextBoundObject, like String, you can be in a nondefault context if a ContextBoundObject is on your stack in the current application domain.

Cuando el código se ejecuta en un contexto no predeterminado, especificar true para exitContext hace que el subproceso salga del contexto administrado no predeterminado (es decir, para realizar la transición al contexto predeterminado) antes de ejecutar el WaitOne método.When your code is executing in a nondefault context, specifying true for exitContext causes the thread to exit the nondefault managed context (that is, to transition to the default context) before executing the WaitOne method. El subproceso vuelve al contexto original no predeterminado después de llamar a la WaitOne método se completa.The thread returns to the original nondefault context after the call to the WaitOne method completes.

Esto puede ser útil cuando la clase de contexto enlazado tiene SynchronizationAttribute.This can be useful when the context-bound class has SynchronizationAttribute. En ese caso, todas las llamadas a miembros de la clase se sincronizan automáticamente y el dominio de sincronización es todo el cuerpo de código para la clase.In that case, all calls to members of the class are automatically synchronized, and the synchronization domain is the entire body of code for the class. Si llama código en la pila de llamadas de un miembro de la WaitOne método y especifica true para exitContext, el subproceso sale del dominio de sincronización, lo que permite un subproceso que esté bloqueado en una llamada a cualquier miembro del objeto para continuar.If code in the call stack of a member calls the WaitOne method and specifies true for exitContext, the thread exits the synchronization domain, allowing a thread that is blocked on a call to any member of the object to proceed. Cuando el WaitOne método finaliza, el subproceso que realizó la llamada debe esperar para volver a escribir el dominio de sincronización.When the WaitOne method returns, the thread that made the call must wait to reenter the synchronization domain.

Se aplica a