Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

WaitHandle.WaitAny (Método) (WaitHandle[], Int32, Boolean)

Espera a que cualquiera de los elementos de la matriz especificada reciba una señal, utilizando un entero de 32 bits con signo para especificar el intervalo de tiempo y especificar si se va a salir del dominio de sincronización antes de la espera.

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

public static int WaitAny(
	WaitHandle[] waitHandles,
	int millisecondsTimeout,
	bool exitContext
)

Parámetros

waitHandles
Tipo: System.Threading.WaitHandle[]
Matriz WaitHandle que contiene los objetos por los que la instancia actual esperará.
millisecondsTimeout
Tipo: System.Int32
Número de milisegundos de espera o Timeout.Infinite (-1) para esperar indefinidamente.
exitContext
Tipo: System.Boolean
true para salir del dominio de sincronización para el contexto antes de la espera (en caso de encontrarse en un contexto sincronizado) y volver a adquirirlo más tarde; en caso contrario, false.

Valor devuelto

Tipo: System.Int32
Índice de matriz del objeto que satisfizo la espera o WaitTimeout si ningún objeto ha satisfecho la espera y ha transcurrido un intervalo de tiempo equivalente a millisecondsTimeout.

ExcepciónCondición
ArgumentNullException

El parámetro waitHandles es null.

O bien

Al menos uno de los objetos de la matriz waitHandles es null.

NotSupportedException

El número de objetos de waitHandles es mayor que lo que permite el sistema.

ApplicationException

waitHandles es una matriz sin elementos y la versión de .NET Framework es 1.0 o 1.1.

ArgumentOutOfRangeException

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

AbandonedMutexException

La espera finalizó porque un subproceso se cerró sin liberar una exclusión mutua. Esta excepción no se genera en Windows 98 ni en Windows Millennium.

ArgumentException

waitHandles es una matriz sin elementos y la versión de .NET Framework es 2.0 o posterior.

InvalidOperationException

La matriz waitHandles contiene un proxy transparente para un objeto WaitHandle en otro dominio de aplicación.

Si millisecondsTimeout es cero, el método no se bloquea. Comprueba el estado de los identificadores de espera y vuelve inmediatamente.

AbandonedMutexException es nuevo en la versión 2.0 de .NET Framework. En las versiones anteriores, el método WaitAny devuelve true cuando se finaliza la espera porque se ha abandonado una exclusión mutua. Una exclusión mutua abandonada suele indicar un error de codificación grave. En el caso de exclusión mutua en todo el sistema, podría indicar que una aplicación ha finalizado de forma abrupta (por ejemplo, mediante el Administrador de tareas de Windows). La excepción contiene información útil para depurar.

El método WaitAny sólo produce una excepción AbandonedMutexException cuando la espera finaliza por una exclusión mutua abandonada. Si waitHandles contiene una exclusión mutua liberada con un número de índice inferior al de la exclusión mutua abandonada, el método WaitAny finaliza de forma normal y no se produce la excepción.

NotaNota

En las versiones anteriores a la versión 2.0 de .NET Framework, si un subproceso se cierra o anula sin liberar explícitamente una clase Mutex y dicho parámetro Mutex está en el índice 0 (cero) de una matriz WaitAny de otro subproceso, el índice que devuelve WaitAny es 128 en lugar de 0.

Este método devuelve el momento de finalización de la espera, bien cuando cualquiera de los identificadores está señalado o bien cuando transcurre el tiempo de espera. Si durante la llamada se señala más de un objeto, el valor devuelto es el índice de la matriz del objeto señalado que tenga el menor valor de índice de todos los objetos señalados. En algunas implementaciones, si se pasan más de 64 identificadores, se produce una excepción NotSupportedException.

Notas sobre la salida del contexto

El parámetro exitContext no tiene ningún efecto a menos que se llame al método WaitAny desde 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 no se derive de ContextBoundObject, como String, puede estar en un contexto no predeterminado si hay una clase ContextBoundObject en la pila del actual dominio de aplicación.

Cuando el código se ejecuta en un contexto no predeterminado, especificar el valor true para exitContext hace que el subproceso salga del contexto administrado no predeterminado (es decir, que pase al contexto predeterminado) antes de que se ejecute el método WaitAny. El subproceso volverá al contexto no predeterminado original cuando finalice la llamada al método WaitAny.

Esto puede ser útil cuando la clase enlazada al contexto tiene SynchronizationAttribute. En ese caso, todas las llamadas a los miembros de la clase se sincronizan automáticamente y el dominio de sincronización es el cuerpo de código completo para la clase. Si el código de la pila de llamadas de un miembro llama al método WaitAny y especifica true para exitContext, el subproceso saldrá del dominio de sincronización, permitiendo la continuación de un subproceso que esté bloqueado en una llamada a cualquier miembro del objeto. Cuando el método WaitAny realiza una devolución, el subproceso que hizo la llamada debe esperar para volver a entrar en el dominio de sincronización.

En el ejemplo de código siguiente se muestra la forma de utilizar el grupo de subprocesos para buscar simultáneamente un archivo en varios discos. Por motivos de espacio, sólo se busca en el directorio raíz de cada disco.


using System;
using System.IO;
using System.Threading;

class Test
{
    static void Main()
    {
        Search search = new Search();
        search.FindFile("SomeFile.dat");
    }
}

class Search
{
    // Maintain state information to pass to FindCallback.
    class State
    {
        public AutoResetEvent autoEvent;
        public string         fileName;

        public State(AutoResetEvent autoEvent, string fileName)
        {
            this.autoEvent    = autoEvent;
            this.fileName     = fileName;
        }
    }

    AutoResetEvent[] autoEvents;
    String[] diskLetters;

    public Search()
    {
        // Retrieve an array of disk letters.
        diskLetters = Environment.GetLogicalDrives();

        autoEvents = new AutoResetEvent[diskLetters.Length];
        for(int i = 0; i < diskLetters.Length; i++)
        {
            autoEvents[i] = new AutoResetEvent(false);
        }
    }

    // Search for fileName in the root directory of all disks.
    public void FindFile(string fileName)
    {
        for(int i = 0; i < diskLetters.Length; i++)
        {
            Console.WriteLine("Searching for {0} on {1}.",
                fileName, diskLetters[i]);
            ThreadPool.QueueUserWorkItem(
                new WaitCallback(FindCallback), 
                new State(autoEvents[i], diskLetters[i] + fileName));
        }

        // Wait for the first instance of the file to be found.
        int index = WaitHandle.WaitAny(autoEvents, 3000, false);
        if(index == WaitHandle.WaitTimeout)
        {
            Console.WriteLine("\n{0} not found.", fileName);
        }
        else
        {
            Console.WriteLine("\n{0} found on {1}.", fileName,
                diskLetters[index]);
        }
    }

    // Search for stateInfo.fileName.
    void FindCallback(object state)
    {
        State stateInfo = (State)state;

        // Signal if the file is found.
        if(File.Exists(stateInfo.fileName))
        {
            stateInfo.autoEvent.Set();
        }
    }
}


.NET Framework

Compatible con: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2015 Microsoft