Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Método WaitHandle.WaitOne (TimeSpan, Boolean)

 

Publicado: octubre de 2016

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.

Espacio de nombres:   System.Threading
Ensamblado:  mscorlib (en mscorlib.dll)

public virtual bool WaitOne(
	TimeSpan timeout,
	bool exitContext
)

Parámetros

timeout
Type: System.TimeSpan

Estructura TimeSpan que representa el número de milisegundos de espera o estructura TimeSpan que representa -1 milisegundos para esperar indefinidamente.

exitContext
Type: System.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.

Valor devuelto

Type: System.Boolean

true si la instancia actual recibe una señal; de lo contrario, false.

Exception Condition
ObjectDisposedException

Ya se ha eliminado la instancia actual.

ArgumentOutOfRangeException

timeout es un número negativo distinto de-1 milisegundos, que representa un tiempo de espera infinito.

-o-

timeout es mayor que Int32.MaxValue.

AbandonedMutexException

La espera se completó porque un subproceso sale sin liberar una exclusión mutua. Esta excepción no se produce en Windows 98 o Windows Millennium Edition.

InvalidOperationException

La instancia actual es un proxy transparente para un WaitHandle en otro dominio de aplicación.

Si timeout es cero, el método no se bloquea. Comprueba el estado del identificador de espera y vuelve inmediatamente.

AbandonedMutexException es nuevo en la versión 2.0 de .NET Framework. En versiones anteriores, el WaitOne método devuelve true cuando se abandona una exclusión mutua. A menudo, un mutex abandonado indica un error de codificación grave. En el caso de una exclusión mutua todo el sistema, podría indicar que una aplicación ha finalizado inesperadamente (por ejemplo, mediante el Administrador de tareas de Windows). La excepción contiene información útil para la depuración.

Se produce el llamador de este método se bloquea hasta que la instancia actual recibe una señal o un tiempo de espera. 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. Para obtener más información, consulte el IAsyncResult interfaz.

Invalide este método para personalizar el comportamiento de las clases derivadas.

El valor máximo de timeout es Int32.MaxValue.

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. Esto puede suceder si el subproceso está dentro de una llamada a una instancia de una clase derivada de ContextBoundObject. Aunque esté ejecutando un método en una clase que 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.

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, que pase al contexto predeterminado) antes de ejecutar el WaitOne método. El subproceso volverá al contexto no predeterminado original después de la llamada a la WaitOne método se completa.

Esto puede ser útil cuando la clase enlazada de contexto tiene 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. Si el código de la pila de llamadas de un miembro llama el WaitOne (método) y especifica true para exitContext, el subproceso saldrá del dominio de sincronización, que permite que un subproceso que esté bloqueado en una llamada a cualquier miembro del objeto para continuar. Cuando el WaitOne devuelve el método, el subproceso que realiza la llamada debe esperar para volver a escribir el dominio de sincronización.

En el ejemplo de código siguiente se muestra cómo usar un identificador de espera para mantener un proceso sin terminar mientras espera a que termine de ejecutarse un subproceso en segundo plano.

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

.NET Framework
Disponible desde 1.1
Volver al principio
Mostrar: