WaitHandle.WaitAny WaitHandle.WaitAny WaitHandle.WaitAny WaitHandle.WaitAny Method

Определение

Ожидает получения сигнала какими-либо элементами заданного массива.Waits for any of the elements in the specified array to receive a signal.

Перегрузки

WaitAny(WaitHandle[]) WaitAny(WaitHandle[]) WaitAny(WaitHandle[]) WaitAny(WaitHandle[])

Ожидает получения сигнала какими-либо элементами заданного массива.Waits for any of the elements in the specified array to receive a signal.

WaitAny(WaitHandle[], Int32) WaitAny(WaitHandle[], Int32) WaitAny(WaitHandle[], Int32) WaitAny(WaitHandle[], Int32)

Ожидает получения сигнала любыми элементами указанного массива, используя 32-разрядное целое число со знаком для задания интервала времени.Waits for any of the elements in the specified array to receive a signal, using a 32-bit signed integer to specify the time interval.

WaitAny(WaitHandle[], TimeSpan) WaitAny(WaitHandle[], TimeSpan) WaitAny(WaitHandle[], TimeSpan) WaitAny(WaitHandle[], TimeSpan)

Ожидает получения сигнала любыми элементами заданного массива, используя значение типа TimeSpan для указания интервала времени.Waits for any of the elements in the specified array to receive a signal, using a TimeSpan to specify the time interval.

WaitAny(WaitHandle[], Int32, Boolean) WaitAny(WaitHandle[], Int32, Boolean) WaitAny(WaitHandle[], Int32, Boolean) WaitAny(WaitHandle[], Int32, Boolean)

Ожидает, пока какой-либо из элементов заданного массива не получит сигнал, используя 32-разрядное целое число со знаком для задания интервала времени и определения, нужно ли осуществить выход из домена синхронизации до окончания ожидания.Waits for any of the elements in the specified array to receive a signal, using a 32-bit signed integer to specify the time interval, and specifying whether to exit the synchronization domain before the wait.

WaitAny(WaitHandle[], TimeSpan, Boolean) WaitAny(WaitHandle[], TimeSpan, Boolean) WaitAny(WaitHandle[], TimeSpan, Boolean) WaitAny(WaitHandle[], TimeSpan, Boolean)

Ожидает получения сигнала какими-либо элементами заданного массива, используя TimeSpan для задания интервала времени и указывая, следует ли выйти из домена синхронизации до начала ожидания.Waits for any of the elements in the specified array to receive a signal, using a TimeSpan to specify the time interval and specifying whether to exit the synchronization domain before the wait.

WaitAny(WaitHandle[]) WaitAny(WaitHandle[]) WaitAny(WaitHandle[]) WaitAny(WaitHandle[])

Ожидает получения сигнала какими-либо элементами заданного массива.Waits for any of the elements in the specified array to receive a signal.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles);
public static int WaitAny (System.Threading.WaitHandle[] waitHandles);
static member WaitAny : System.Threading.WaitHandle[] -> int
Public Shared Function WaitAny (waitHandles As WaitHandle()) As Integer

Параметры

waitHandles
WaitHandle[]

Массив WaitHandle, содержащий объекты, ожидаемые текущим экземпляром.A WaitHandle array containing the objects for which the current instance will wait.

Возвраты

Индекс объекта, удовлетворившего операцию ожидания, в массиве.The array index of the object that satisfied the wait.

Исключения

Параметр waitHandles имеет значение null.The waitHandles parameter is null.

-или--or- Один или несколько объектов массива waitHandles имеют значение null.One or more of the objects in the waitHandles array is null.

Массив waitHandles содержит больше объектов, чем разрешено системой.The number of objects in waitHandles is greater than the system permits.

waitHandles является массивом без элементов, а платформа .NET Framework имеет версию 1.0 или 1.1.waitHandles is an array with no elements, and the .NET Framework version is 1.0 or 1.1.

Ожидание закончилось, так как поток завершил работу, не освободив мьютекс.The wait completed because a thread exited without releasing a mutex. Это исключение не вызывается в ОС Windows 98 или Windows Millennium Edition.This exception is not thrown on Windows 98 or Windows Millennium Edition.

waitHandles является массивом без элементов, а платформа .NET Framework имеет версию 2.0 или выше.waitHandles is an array with no elements, and the .NET Framework version is 2.0 or later.

Массив waitHandles содержит прозрачный прокси для элемента WaitHandle в другом домене приложения.The waitHandles array contains a transparent proxy for a WaitHandle in another application domain.

Примеры

В следующем примере кода показан вызов WaitAny метод.The following code example demonstrates calling the WaitAny method.

using namespace System;
using namespace System::Threading;

public ref class WaitHandleExample
{
    // Define a random number generator for testing.
private:
    static Random^ random = gcnew Random();
public:
    static void DoTask(Object^ state)
    {
        AutoResetEvent^ autoReset = (AutoResetEvent^) state;
        int time = 1000 * random->Next(2, 10);
        Console::WriteLine("Performing a task for {0} milliseconds.", time);
        Thread::Sleep(time);
        autoReset->Set();
    }
};

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

// This code produces the following sample output.
//
// Main thread is waiting for BOTH tasks to complete.
// Performing a task for 7000 milliseconds.
// Performing a task for 4000 milliseconds.
// Both tasks are completed (time waited=7064.8052)

// The main thread is waiting for either task to complete.
// Performing a task for 2000 milliseconds.
// Performing a task for 2000 milliseconds.
// Task 1 finished first (time waited=2000.6528).
using System;
using System.Threading;

public sealed class App 
{
    // Define an array with two AutoResetEvent WaitHandles.
    static WaitHandle[] waitHandles = new WaitHandle[] 
    {
        new AutoResetEvent(false),
        new AutoResetEvent(false)
    };

    // Define a random number generator for testing.
    static Random r = new Random();

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

    static void DoTask(Object state) 
    {
        AutoResetEvent are = (AutoResetEvent) state;
        int time = 1000 * r.Next(2, 10);
        Console.WriteLine("Performing a task for {0} milliseconds.", time);
        Thread.Sleep(time);
        are.Set();
    }
}

// This code produces output similar to the following:
//
//  Main thread is waiting for BOTH tasks to complete.
//  Performing a task for 7000 milliseconds.
//  Performing a task for 4000 milliseconds.
//  Both tasks are completed (time waited=7064.8052)
// 
//  The main thread is waiting for either task to complete.
//  Performing a task for 2000 milliseconds.
//  Performing a task for 2000 milliseconds.
//  Task 1 finished first (time waited=2000.6528).
Imports System
Imports System.Threading

NotInheritable Public Class App
    ' Define an array with two AutoResetEvent WaitHandles.
    Private Shared waitHandles() As WaitHandle = _
        {New AutoResetEvent(False), New AutoResetEvent(False)}
    
    ' Define a random number generator for testing.
    Private Shared r As New Random()
    
    <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
    
    Shared Sub DoTask(ByVal state As [Object]) 
        Dim are As AutoResetEvent = CType(state, AutoResetEvent)
        Dim time As Integer = 1000 * r.Next(2, 10)
        Console.WriteLine("Performing a task for {0} milliseconds.", time)
        Thread.Sleep(time)
        are.Set()
    
    End Sub 'DoTask
End Class 'App

' This code produces output similar to the following:
'
'  Main thread is waiting for BOTH tasks to complete.
'  Performing a task for 7000 milliseconds.
'  Performing a task for 4000 milliseconds.
'  Both tasks are completed (time waited=7064.8052)
' 
'  The main thread is waiting for either task to complete.
'  Performing a task for 2000 milliseconds.
'  Performing a task for 2000 milliseconds.
'  Task 1 finished first (time waited=2000.6528).

Комментарии

AbandonedMutexException является новым в .NET Framework версии 2.0.AbandonedMutexException is new in the .NET Framework version 2.0. В предыдущих версиях WaitAny возвращает метод true Если ожидание завершается, так как мьютекс завершается.In previous versions, the WaitAny method returns true if the wait completes because a mutex is abandoned. Брошенный мьютекс часто признаком серьезной ошибки в коде.An abandoned mutex often indicates a serious coding error. В случае мьютекс всей системы это может означать, что приложения была внезапно прекращена (например, с помощью диспетчера задач 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). Исключение содержит сведения, полезные для отладки.The exception contains information useful for debugging.

WaitAny Вызывает метод AbandonedMutexException только тогда, когда ожидание завершается из-за брошенного мьютекса.The WaitAny method throws an AbandonedMutexException only when the wait completes because of an abandoned mutex. Если waitHandles содержит выпущенные мьютекс с меньшим количеством индекса, чем Брошенный мьютекс, WaitAny метод завершается нормально, и исключение не создается.If waitHandles contains a released mutex with a lower index number than the abandoned mutex, the WaitAny method completes normally and the exception is not thrown.

Примечание

В версиях .NET Framework до версии 2.0, если поток завершает работу или прерывает без явно освобождая Mutexи что Mutex имеет индекс 0 (ноль) в WaitAny массива в другом потоке, индекс, возвращенный WaitAny — 128 вместо 0.In versions of the .NET Framework earlier than version 2.0, if a thread exits or aborts without explicitly releasing a Mutex, and that Mutex is at index 0 (zero) in a WaitAny array on another thread, the index returned by WaitAny is 128 instead of 0.

Этот метод возвращает при любой дескриптор получает сигнал.This method returns when any handle is signaled. Если во время вызова оповещенным более одного объекта, возвращается индекс массива объект получил сигнал с наименьшим значением индекса сигнальное объектов.If more than one object becomes signaled during the call, the return value is the array index of the signaled object with the smallest index value of all the signaled objects. В некоторых реализациях, если сведения, которые передаются 64 дескрипторов NotSupportedException возникает исключение.On some implementations, if more that 64 handles are passed, a NotSupportedException is thrown.

Вызов перегрузки этого метода эквивалентен вызову WaitAny(WaitHandle[], Int32, Boolean) перегрузку метода и указав значение -1 (или Timeout.Infinite) для millisecondsTimeout и true для exitContext.Calling this method overload is equivalent to calling the WaitAny(WaitHandle[], Int32, Boolean) method overload and specifying -1 (or Timeout.Infinite) for millisecondsTimeout and true for exitContext.

WaitAny(WaitHandle[], Int32) WaitAny(WaitHandle[], Int32) WaitAny(WaitHandle[], Int32) WaitAny(WaitHandle[], Int32)

Ожидает получения сигнала любыми элементами указанного массива, используя 32-разрядное целое число со знаком для задания интервала времени.Waits for any of the elements in the specified array to receive a signal, using a 32-bit signed integer to specify the time interval.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, int millisecondsTimeout);
public static int WaitAny (System.Threading.WaitHandle[] waitHandles, int millisecondsTimeout);
static member WaitAny : System.Threading.WaitHandle[] * int -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), millisecondsTimeout As Integer) As Integer

Параметры

waitHandles
WaitHandle[]

Массив WaitHandle, содержащий объекты, ожидаемые текущим экземпляром.A WaitHandle array containing the objects for which the current instance will wait.

millisecondsTimeout
Int32 Int32 Int32 Int32

Время ожидания в миллисекундах или функция Infinite (-1) в случае неограниченного времени ожидания.The number of milliseconds to wait, or Infinite (-1) to wait indefinitely.

Возвраты

Индекс объекта в массиве, удовлетворившего условиям ожидания, или значение WaitTimeout, если ни один из объектов не удовлетворил условиям ожидания и истек интервал времени, равный millisecondsTimeout.The array index of the object that satisfied the wait, or WaitTimeout if no object satisfied the wait and a time interval equivalent to millisecondsTimeout has passed.

Исключения

Параметр waitHandles имеет значение null.The waitHandles parameter is null.

-или--or- Один или несколько объектов массива waitHandles имеют значение null.One or more of the objects in the waitHandles array is null.

Массив waitHandles содержит больше объектов, чем разрешено системой.The number of objects in waitHandles is greater than the system permits.

Параметр millisecondsTimeout является отрицательным числом, отличным от –1, что означает бесконечное время ожидания.millisecondsTimeout is a negative number other than -1, which represents an infinite time-out.

Ожидание закончилось, так как поток завершил работу, не освободив мьютекс.The wait completed because a thread exited without releasing a mutex. Это исключение не вызывается в ОС Windows 98 или Windows Millennium Edition.This exception is not thrown on Windows 98 or Windows Millennium Edition.

В массиве waitHandles отсутствуют элементы.waitHandles is an array with no elements.

Массив waitHandles содержит прозрачный прокси для элемента WaitHandle в другом домене приложения.The waitHandles array contains a transparent proxy for a WaitHandle in another application domain.

Комментарии

Если millisecondsTimeout равно нулю, метод не блокируется.If millisecondsTimeout is zero, the method does not block. Он проверяет состояние дескрипторов ожидания и немедленно возвращает.It tests the state of the wait handles and returns immediately.

WaitAny Вызывает метод AbandonedMutexException только тогда, когда ожидание завершается из-за брошенного мьютекса.The WaitAny method throws an AbandonedMutexException only when the wait completes because of an abandoned mutex. Если waitHandles содержит выпущенные мьютекс с меньшим количеством индекса, чем Брошенный мьютекс, WaitAny метод завершается нормально, и исключение не создается.If waitHandles contains a released mutex with a lower index number than the abandoned mutex, the WaitAny method completes normally and the exception is not thrown.

Этот метод возвращает, если ожидание завершается, когда все дескрипторы получили сигнал или истечении времени ожидания.This method returns when the wait terminates, either when any of the handles are signaled or when a timeout occurs. Если во время вызова оповещенным более одного объекта, возвращается индекс массива объект получил сигнал с наименьшим значением индекса сигнальное объектов.If more than one object becomes signaled during the call, the return value is the array index of the signaled object with the smallest index value of all the signaled objects. В некоторых реализациях, если сведения, которые передаются 64 дескрипторов NotSupportedException возникает исключение.On some implementations, if more that 64 handles are passed, a NotSupportedException is thrown.

Вызов перегрузки этого метода равносилен вызову метода является WaitAny(WaitHandle[], Int32, Boolean) перегрузки и указав false для exitContext.Calling this method overload is the same as calling the WaitAny(WaitHandle[], Int32, Boolean) overload and specifying false for exitContext.

WaitAny(WaitHandle[], TimeSpan) WaitAny(WaitHandle[], TimeSpan) WaitAny(WaitHandle[], TimeSpan) WaitAny(WaitHandle[], TimeSpan)

Ожидает получения сигнала любыми элементами заданного массива, используя значение типа TimeSpan для указания интервала времени.Waits for any of the elements in the specified array to receive a signal, using a TimeSpan to specify the time interval.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, TimeSpan timeout);
public static int WaitAny (System.Threading.WaitHandle[] waitHandles, TimeSpan timeout);
static member WaitAny : System.Threading.WaitHandle[] * TimeSpan -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), timeout As TimeSpan) As Integer

Параметры

waitHandles
WaitHandle[]

Массив WaitHandle, содержащий объекты, ожидаемые текущим экземпляром.A WaitHandle array containing the objects for which the current instance will wait.

timeout
TimeSpan TimeSpan TimeSpan TimeSpan

Период TimeSpan, представляющий время ожидания в миллисекундах, или период TimeSpan, представляющий -1 миллисекунду для неограниченного ожидания.A TimeSpan that represents the number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely.

Возвраты

Индекс объекта в массиве, удовлетворившего условиям ожидания, или значение WaitTimeout, если ни один из объектов не удовлетворил условиям ожидания и истек интервал времени, равный timeout.The array index of the object that satisfied the wait, or WaitTimeout if no object satisfied the wait and a time interval equivalent to timeout has passed.

Исключения

Параметр waitHandles имеет значение null.The waitHandles parameter is null.

-или--or- Один или несколько объектов массива waitHandles имеют значение null.One or more of the objects in the waitHandles array is null.

Массив waitHandles содержит больше объектов, чем разрешено системой.The number of objects in waitHandles is greater than the system permits.

timeout является отрицательным числом, отличным от -1 миллисекунды, которое представляет неограниченное время ожидания.timeout is a negative number other than -1 milliseconds, which represents an infinite time-out. -или--or- Значение timeout больше значения MaxValue.timeout is greater than MaxValue.

Ожидание закончилось, так как поток завершил работу, не освободив мьютекс.The wait completed because a thread exited without releasing a mutex. Это исключение не вызывается в ОС Windows 98 или Windows Millennium Edition.This exception is not thrown on Windows 98 or Windows Millennium Edition.

В массиве waitHandles отсутствуют элементы.waitHandles is an array with no elements.

Массив waitHandles содержит прозрачный прокси для элемента WaitHandle в другом домене приложения.The waitHandles array contains a transparent proxy for a WaitHandle in another application domain.

Комментарии

Если timeout равно нулю, метод не блокируется.If timeout is zero, the method does not block. Он проверяет состояние дескрипторов ожидания и немедленно возвращает.It tests the state of the wait handles and returns immediately.

WaitAny Вызывает метод AbandonedMutexException только тогда, когда ожидание завершается из-за брошенного мьютекса.The WaitAny method throws an AbandonedMutexException only when the wait completes because of an abandoned mutex. Если waitHandles содержит выпущенные мьютекс с меньшим количеством индекса, чем Брошенный мьютекс, WaitAny метод завершается нормально, и исключение не создается.If waitHandles contains a released mutex with a lower index number than the abandoned mutex, the WaitAny method completes normally and the exception is not thrown.

Этот метод возвращает, если ожидание завершается, когда все дескрипторы получили сигнал или при возникновении тайм-аута.This method returns when the wait terminates, either when any of the handles are signaled or when a time-out occurs. Если во время вызова оповещенным более одного объекта, возвращается индекс массива объект получил сигнал с наименьшим значением индекса сигнальное объектов.If more than one object becomes signaled during the call, the return value is the array index of the signaled object with the smallest index value of all the signaled objects. В некоторых реализациях, если сведения, которые передаются 64 дескрипторов NotSupportedException возникает исключение.On some implementations, if more that 64 handles are passed, a NotSupportedException is thrown.

Максимальное значение для timeout является Int32.MaxValue.The maximum value for timeout is Int32.MaxValue.

Вызов перегрузки этого метода равносилен вызову метода является WaitAny(WaitHandle[], TimeSpan, Boolean) перегрузки и указав false для exitContext.Calling this method overload is the same as calling the WaitAny(WaitHandle[], TimeSpan, Boolean) overload and specifying false for exitContext.

WaitAny(WaitHandle[], Int32, Boolean) WaitAny(WaitHandle[], Int32, Boolean) WaitAny(WaitHandle[], Int32, Boolean) WaitAny(WaitHandle[], Int32, Boolean)

Ожидает, пока какой-либо из элементов заданного массива не получит сигнал, используя 32-разрядное целое число со знаком для задания интервала времени и определения, нужно ли осуществить выход из домена синхронизации до окончания ожидания.Waits for any of the elements in the specified array to receive 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:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, int millisecondsTimeout, bool exitContext);
public static int WaitAny (System.Threading.WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext);
static member WaitAny : System.Threading.WaitHandle[] * int * bool -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), millisecondsTimeout As Integer, exitContext As Boolean) As Integer

Параметры

waitHandles
WaitHandle[]

Массив WaitHandle, содержащий объекты, ожидаемые текущим экземпляром.A WaitHandle array containing the objects for which the current instance will wait.

millisecondsTimeout
Int32 Int32 Int32 Int32

Время ожидания в миллисекундах или функция Infinite (-1) в случае неограниченного времени ожидания.The number of milliseconds to wait, or Infinite (-1) to wait indefinitely.

exitContext
Boolean Boolean Boolean Boolean

Значение true для выхода из домена синхронизации в текущем контексте перед ожиданием (в синхронизированном контексте) с его последующим повторным получением; в противном случае — false.true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it afterward; otherwise, false.

Возвраты

Индекс объекта в массиве, удовлетворившего условиям ожидания, или значение WaitTimeout, если ни один из объектов не удовлетворил условиям ожидания и истек интервал времени, равный millisecondsTimeout.The array index of the object that satisfied the wait, or WaitTimeout if no object satisfied the wait and a time interval equivalent to millisecondsTimeout has passed.

Исключения

Параметр waitHandles имеет значение null.The waitHandles parameter is null.

-или--or- Один или несколько объектов массива waitHandles имеют значение null.One or more of the objects in the waitHandles array is null.

Массив waitHandles содержит больше объектов, чем разрешено системой.The number of objects in waitHandles is greater than the system permits.

waitHandles является массивом без элементов, а платформа .NET Framework имеет версию 1.0 или 1.1.waitHandles is an array with no elements, and the .NET Framework version is 1.0 or 1.1.

Параметр millisecondsTimeout является отрицательным числом, отличным от –1, что означает бесконечное время ожидания.millisecondsTimeout is a negative number other than -1, which represents an infinite time-out.

Ожидание закончилось, так как поток завершил работу, не освободив мьютекс.The wait completed because a thread exited without releasing a mutex. Это исключение не вызывается в ОС Windows 98 или Windows Millennium Edition.This exception is not thrown on Windows 98 or Windows Millennium Edition.

waitHandles является массивом без элементов, а платформа .NET Framework имеет версию 2.0 или выше.waitHandles is an array with no elements, and the .NET Framework version is 2.0 or later.

Массив waitHandles содержит прозрачный прокси для элемента WaitHandle в другом домене приложения.The waitHandles array contains a transparent proxy for a WaitHandle in another application domain.

Примеры

В следующем примере кода показано, как использовать пул потоков для поиска файла на несколько дисков одновременно.The following code example demonstrates how to use the thread pool to simultaneously search for a file on multiple disks. Для краткости выполнялся поиск только в корневом каталоге каждого диска.For space considerations, only the root directory of each disk is searched.

using namespace System;
using namespace System::IO;
using namespace System::Threading;
ref class Search
{
private:

   // Maintain state information to pass to FindCallback.
   ref class State
   {
   public:
      AutoResetEvent^ autoEvent;
      String^ fileName;
      State( AutoResetEvent^ autoEvent, String^ fileName )
         : autoEvent( autoEvent ), fileName( fileName )
      {}

   };


public:
   array<AutoResetEvent^>^autoEvents;
   array<String^>^diskLetters;

   // Search for stateInfo->fileName.
   void FindCallback( Object^ state )
   {
      State^ stateInfo = dynamic_cast<State^>(state);
      
      // Signal if the file is found.
      if ( File::Exists( stateInfo->fileName ) )
      {
         stateInfo->autoEvent->Set();
      }
   }

   Search()
   {
      
      // Retrieve an array of disk letters.
      diskLetters = Environment::GetLogicalDrives();
      autoEvents = gcnew array<AutoResetEvent^>(diskLetters->Length);
      for ( int i = 0; i < diskLetters->Length; i++ )
      {
         autoEvents[ i ] = gcnew AutoResetEvent( false );

      }
   }


   // Search for fileName in the root directory of all disks.
   void FindFile( String^ fileName )
   {
      for ( int i = 0; i < diskLetters->Length; i++ )
      {
         Console::WriteLine(  "Searching for {0} on {1}.", fileName, diskLetters[ i ] );
         ThreadPool::QueueUserWorkItem( gcnew WaitCallback( this, &Search::FindCallback ), gcnew State( autoEvents[ i ],String::Concat( 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 ] );
      }
   }

};

int main()
{
   Search^ search = gcnew Search;
   search->FindFile( "SomeFile.dat" );
}

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();
        }
    }
}
Imports Microsoft.VisualBasic
Imports System
Imports System.IO
Imports System.Threading

Public Class Test

    <MTAThread> _
    Shared Sub Main()
        Dim search As New Search()
        search.FindFile("SomeFile.dat")
    End Sub    
End Class

Public Class Search

    ' Maintain state information to pass to FindCallback.
    Class State
        Public autoEvent As AutoResetEvent 
        Public fileName As String         

        Sub New(anEvent As AutoResetEvent, fName As String)
            autoEvent = anEvent
            fileName = fName
        End Sub
    End Class

    Dim autoEvents() As AutoResetEvent
    Dim diskLetters() As String

    Sub New()

        ' Retrieve an array of disk letters.
        diskLetters = Environment.GetLogicalDrives()

        autoEvents = New AutoResetEvent(diskLetters.Length - 1) {}
        For i As Integer = 0 To diskLetters.Length - 1
            autoEvents(i) = New AutoResetEvent(False)
        Next i
    End Sub    
    
    ' Search for fileName in the root directory of all disks.
    Sub FindFile(fileName As String)
        For i As Integer = 0 To diskLetters.Length - 1
            Console.WriteLine("Searching for {0} on {1}.", _
                fileName, diskLetters(i))
        
            ThreadPool.QueueUserWorkItem(AddressOf FindCallback, _ 
                New State(autoEvents(i), diskLetters(i) & fileName))
        Next i

        ' Wait for the first instance of the file to be found.
        Dim index As Integer = _
            WaitHandle.WaitAny(autoEvents, 3000, False)
        If index = WaitHandle.WaitTimeout
            Console.WriteLine(vbCrLf & "{0} not found.", fileName)
        Else
            Console.WriteLine(vbCrLf & "{0} found on {1}.", _
                fileName, diskLetters(index))
        End If
    End Sub

    ' Search for stateInfo.fileName.
    Sub FindCallback(state As Object)
        Dim stateInfo As State = DirectCast(state, State)

        ' Signal if the file is found.
        If File.Exists(stateInfo.fileName) Then
            stateInfo.autoEvent.Set()
        End If
    End Sub

End Class

Комментарии

Если millisecondsTimeout равно нулю, метод не блокируется.If millisecondsTimeout is zero, the method does not block. Он проверяет состояние дескрипторов ожидания и немедленно возвращает.It tests the state of the wait handles and returns immediately.

AbandonedMutexException является новым в .NET Framework версии 2.0.AbandonedMutexException is new in the .NET Framework version 2.0. В предыдущих версиях WaitAny возвращает метод true Если ожидание завершается, так как мьютекс завершается.In previous versions, the WaitAny method returns true if the wait completes because a mutex is abandoned. Брошенный мьютекс часто признаком серьезной ошибки в коде.An abandoned mutex often indicates a serious coding error. В случае мьютекс всей системы это может означать, что приложения была внезапно прекращена (например, с помощью диспетчера задач 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). Исключение содержит сведения, полезные для отладки.The exception contains information useful for debugging.

WaitAny Вызывает метод AbandonedMutexException только тогда, когда ожидание завершается из-за брошенного мьютекса.The WaitAny method throws an AbandonedMutexException only when the wait completes because of an abandoned mutex. Если waitHandles содержит выпущенные мьютекс с меньшим количеством индекса, чем Брошенный мьютекс, WaitAny метод завершается нормально, и исключение не создается.If waitHandles contains a released mutex with a lower index number than the abandoned mutex, the WaitAny method completes normally and the exception is not thrown.

Примечание

В версиях .NET Framework до версии 2.0, если поток завершает работу или прерывает без явно освобождая Mutexи что Mutex имеет индекс 0 (ноль) в WaitAny массива в другом потоке, индекс, возвращенный WaitAny — 128 вместо 0.In versions of the .NET Framework earlier than version 2.0, if a thread exits or aborts without explicitly releasing a Mutex, and that Mutex is at index 0 (zero) in a WaitAny array on another thread, the index returned by WaitAny is 128 instead of 0.

Этот метод возвращает, если ожидание завершается, когда все дескрипторы получили сигнал или истечении времени ожидания.This method returns when the wait terminates, either when any of the handles are signaled or when a timeout occurs. Если во время вызова оповещенным более одного объекта, возвращается индекс массива объект получил сигнал с наименьшим значением индекса сигнальное объектов.If more than one object becomes signaled during the call, the return value is the array index of the signaled object with the smallest index value of all the signaled objects. В некоторых реализациях, если сведения, которые передаются 64 дескрипторов NotSupportedException возникает исключение.On some implementations, if more that 64 handles are passed, a NotSupportedException is thrown.

Примечания о выходе из контекстаNotes on Exiting the Context

exitContext Параметр действует только WaitAny метод вызывается из внутри управляемого контекста не по умолчанию.The exitContext parameter has no effect unless the WaitAny method is called from inside a nondefault managed context. Это может произойти, если ваш поток находится внутри вызова к экземпляру класса, производного от ContextBoundObject.This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Даже если в настоящее время выполняется метод в классе, который является производным от ContextBoundObject, например String, может быть в контексте не по умолчанию если ContextBoundObject стеке в текущем домене приложения.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.

Когда ваш код выполняется в контексте не по умолчанию, указав true для exitContext вызывающий поток выйти из управляемого контекста не по умолчанию (то есть для перехода в контекст по умолчанию) перед выполнением WaitAny метод.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 WaitAny method. Поток возвращается к исходному контексту не по умолчанию после вызова WaitAny завершения метода.The thread returns to the original nondefault context after the call to the WaitAny method completes.

Это может быть полезно, если класс контекстно привязанные имеет SynchronizationAttribute.This can be useful when the context-bound class has SynchronizationAttribute. В этом случае все вызовы к членам класса автоматически синхронизируются и области синхронизации находится в теле код для класса.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. Если в стеке вызовов элемента вызывается WaitAny метода с указанием true для exitContext, поток выходит из области синхронизации, позволяя потоку, который блокируется во время вызова любого члена объекта для продолжения.If code in the call stack of a member calls the WaitAny 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. Когда WaitAny метод возвращает поток, которой был сделан вызов должен ожидать повторный ввод области синхронизации.When the WaitAny method returns, the thread that made the call must wait to reenter the synchronization domain.

WaitAny(WaitHandle[], TimeSpan, Boolean) WaitAny(WaitHandle[], TimeSpan, Boolean) WaitAny(WaitHandle[], TimeSpan, Boolean) WaitAny(WaitHandle[], TimeSpan, Boolean)

Ожидает получения сигнала какими-либо элементами заданного массива, используя TimeSpan для задания интервала времени и указывая, следует ли выйти из домена синхронизации до начала ожидания.Waits for any of the elements in the specified array to receive a signal, using a TimeSpan to specify the time interval and specifying whether to exit the synchronization domain before the wait.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, TimeSpan timeout, bool exitContext);
public static int WaitAny (System.Threading.WaitHandle[] waitHandles, TimeSpan timeout, bool exitContext);
static member WaitAny : System.Threading.WaitHandle[] * TimeSpan * bool -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), timeout As TimeSpan, exitContext As Boolean) As Integer

Параметры

waitHandles
WaitHandle[]

Массив WaitHandle, содержащий объекты, ожидаемые текущим экземпляром.A WaitHandle array containing the objects for which the current instance will wait.

timeout
TimeSpan TimeSpan TimeSpan TimeSpan

Период TimeSpan, представляющий время ожидания в миллисекундах, или период TimeSpan, представляющий -1 миллисекунду для неограниченного ожидания.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 для выхода из домена синхронизации в текущем контексте перед ожиданием (в синхронизированном контексте) с его последующим повторным получением; в противном случае — false.true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it afterward; otherwise, false.

Возвраты

Индекс объекта в массиве, удовлетворившего условиям ожидания, или значение WaitTimeout, если ни один из объектов не удовлетворил условиям ожидания и истек интервал времени, равный timeout.The array index of the object that satisfied the wait, or WaitTimeout if no object satisfied the wait and a time interval equivalent to timeout has passed.

Исключения

Параметр waitHandles имеет значение null.The waitHandles parameter is null.

-или--or- Один или несколько объектов массива waitHandles имеют значение null.One or more of the objects in the waitHandles array is null.

Массив waitHandles содержит больше объектов, чем разрешено системой.The number of objects in waitHandles is greater than the system permits.

waitHandles является массивом без элементов, а платформа .NET Framework имеет версию 1.0 или 1.1.waitHandles is an array with no elements, and the .NET Framework version is 1.0 or 1.1.

timeout является отрицательным числом, отличным от -1 миллисекунды, которое представляет неограниченное время ожидания.timeout is a negative number other than -1 milliseconds, which represents an infinite time-out. -или--or- Значение timeout больше значения MaxValue.timeout is greater than MaxValue.

Ожидание закончилось, так как поток завершил работу, не освободив мьютекс.The wait completed because a thread exited without releasing a mutex. Это исключение не вызывается в ОС Windows 98 или Windows Millennium Edition.This exception is not thrown on Windows 98 or Windows Millennium Edition.

waitHandles является массивом без элементов, а платформа .NET Framework имеет версию 2.0 или выше.waitHandles is an array with no elements, and the .NET Framework version is 2.0 or later.

Массив waitHandles содержит прозрачный прокси для элемента WaitHandle в другом домене приложения.The waitHandles array contains a transparent proxy for a WaitHandle in another application domain.

Примеры

В следующем примере кода показано, как использовать пул потоков для поиска файла на несколько дисков одновременно.The following code example demonstrates how to use the thread pool to simultaneously search for a file on multiple disks. Для краткости выполнялся поиск только в корневом каталоге каждого диска.For space considerations, only the root directory of each disk is searched.

using namespace System;
using namespace System::IO;
using namespace System::Threading;
ref class Search
{
private:

   // Maintain state information to pass to FindCallback.
   ref class State
   {
   public:
      AutoResetEvent^ autoEvent;
      String^ fileName;
      State( AutoResetEvent^ autoEvent, String^ fileName )
         : autoEvent( autoEvent ), fileName( fileName )
      {}

   };


public:
   array<AutoResetEvent^>^autoEvents;
   array<String^>^diskLetters;

   // Search for stateInfo->fileName.
   void FindCallback( Object^ state )
   {
      State^ stateInfo = dynamic_cast<State^>(state);
      
      // Signal if the file is found.
      if ( File::Exists( stateInfo->fileName ) )
      {
         stateInfo->autoEvent->Set();
      }
   }

   Search()
   {
      
      // Retrieve an array of disk letters.
      diskLetters = Environment::GetLogicalDrives();
      autoEvents = gcnew array<AutoResetEvent^>(diskLetters->Length);
      for ( int i = 0; i < diskLetters->Length; i++ )
      {
         autoEvents[ i ] = gcnew AutoResetEvent( false );

      }
   }


   // Search for fileName in the root directory of all disks.
   void FindFile( String^ fileName )
   {
      for ( int i = 0; i < diskLetters->Length; i++ )
      {
         Console::WriteLine(  "Searching for {0} on {1}.", fileName, diskLetters[ i ] );
         ThreadPool::QueueUserWorkItem( gcnew WaitCallback( this, &Search::FindCallback ), gcnew State( autoEvents[ i ],String::Concat( diskLetters[ i ], fileName ) ) );

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

};

int main()
{
   Search^ search = gcnew Search;
   search->FindFile( "SomeFile.dat" );
}

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, new TimeSpan(0, 0, 3), 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();
        }
    }
}
Imports Microsoft.VisualBasic
Imports System
Imports System.IO
Imports System.Threading

Public Class Test

    <MTAThread> _
    Shared Sub Main()
        Dim search As New Search()
        search.FindFile("SomeFile.dat")
    End Sub    
End Class

Public Class Search

    ' Maintain state information to pass to FindCallback.
    Class State
        Public autoEvent As AutoResetEvent 
        Public fileName As String         

        Sub New(anEvent As AutoResetEvent, fName As String)
            autoEvent = anEvent
            fileName = fName
        End Sub
    End Class

    Dim autoEvents() As AutoResetEvent
    Dim diskLetters() As String

    Sub New()

        ' Retrieve an array of disk letters.
        diskLetters = Environment.GetLogicalDrives()

        autoEvents = New AutoResetEvent(diskLetters.Length - 1) {}
        For i As Integer = 0 To diskLetters.Length - 1
            autoEvents(i) = New AutoResetEvent(False)
        Next i
    End Sub    
    
    ' Search for fileName in the root directory of all disks.
    Sub FindFile(fileName As String)
        For i As Integer = 0 To diskLetters.Length - 1
            Console.WriteLine("Searching for {0} on {1}.", _
                fileName, diskLetters(i))
        
            ThreadPool.QueueUserWorkItem(AddressOf FindCallback, _ 
                New State(autoEvents(i), diskLetters(i) & fileName))
        Next i

        ' Wait for the first instance of the file to be found.
        Dim index As Integer = WaitHandle.WaitAny( _
            autoEvents, New TimeSpan(0, 0, 3), False)
        If index = WaitHandle.WaitTimeout
            Console.WriteLine(vbCrLf & "{0} not found.", fileName)
        Else
            Console.WriteLine(vbCrLf & "{0} found on {1}.", _
                fileName, diskLetters(index))
        End If
    End Sub

    ' Search for stateInfo.fileName.
    Sub FindCallback(state As Object)
        Dim stateInfo As State = DirectCast(state, State)

        ' Signal if the file is found.
        If File.Exists(stateInfo.fileName) Then
            stateInfo.autoEvent.Set()
        End If
    End Sub

End Class

Комментарии

Если timeout равно нулю, метод не блокируется.If timeout is zero, the method does not block. Он проверяет состояние дескрипторов ожидания и немедленно возвращает.It tests the state of the wait handles and returns immediately.

AbandonedMutexException является новым в .NET Framework версии 2.0.AbandonedMutexException is new in the .NET Framework version 2.0. В предыдущих версиях WaitAny возвращает метод true Если ожидание завершается, так как мьютекс завершается.In previous versions, the WaitAny method returns true if the wait completes because a mutex is abandoned. Брошенный мьютекс часто признаком серьезной ошибки в коде.An abandoned mutex often indicates a serious coding error. В случае мьютекс всей системы это может означать, что приложения была внезапно прекращена (например, с помощью диспетчера задач 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). Исключение содержит сведения, полезные для отладки.The exception contains information useful for debugging.

WaitAny Вызывает метод AbandonedMutexException только тогда, когда ожидание завершается из-за брошенного мьютекса.The WaitAny method throws an AbandonedMutexException only when the wait completes because of an abandoned mutex. Если waitHandles содержит выпущенные мьютекс с меньшим количеством индекса, чем Брошенный мьютекс, WaitAny метод завершается нормально, и исключение не создается.If waitHandles contains a released mutex with a lower index number than the abandoned mutex, the WaitAny method completes normally and the exception is not thrown.

Примечание

В версиях .NET Framework до версии 2.0, если поток завершает работу или прерывает без явно освобождая Mutexи что Mutex имеет индекс 0 (ноль) в WaitAny массива в другом потоке, индекс, возвращенный WaitAny — 128 вместо 0.In versions of the .NET Framework earlier than version 2.0, if a thread exits or aborts without explicitly releasing a Mutex, and that Mutex is at index 0 (zero) in a WaitAny array on another thread, the index returned by WaitAny is 128 instead of 0.

Этот метод возвращает, если ожидание завершается, когда все дескрипторы получили сигнал или при возникновении тайм-аута.This method returns when the wait terminates, either when any of the handles are signaled or when a time-out occurs. Если во время вызова оповещенным более одного объекта, возвращается индекс массива объект получил сигнал с наименьшим значением индекса сигнальное объектов.If more than one object becomes signaled during the call, the return value is the array index of the signaled object with the smallest index value of all the signaled objects. В некоторых реализациях, если сведения, которые передаются 64 дескрипторов NotSupportedException возникает исключение.On some implementations, if more that 64 handles are passed, a NotSupportedException is thrown.

Максимальное значение для timeout является Int32.MaxValue.The maximum value for timeout is Int32.MaxValue.

Примечания о выходе из контекстаNotes on Exiting the Context

exitContext Параметр действует только WaitAny метод вызывается из внутри управляемого контекста не по умолчанию.The exitContext parameter has no effect unless the WaitAny method is called from inside a nondefault managed context. Это может произойти, если ваш поток находится внутри вызова к экземпляру класса, производного от ContextBoundObject.This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Даже если в настоящее время выполняется метод в классе, который является производным от ContextBoundObject, например String, может быть в контексте не по умолчанию если ContextBoundObject стеке в текущем домене приложения.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.

Когда ваш код выполняется в контексте не по умолчанию, указав true для exitContext вызывающий поток выйти из управляемого контекста не по умолчанию (то есть для перехода в контекст по умолчанию) перед выполнением WaitAny метод.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 WaitAny method. Поток возвращается к исходному контексту не по умолчанию после вызова WaitAny завершения метода.The thread returns to the original nondefault context after the call to the WaitAny method completes.

Это может быть полезно, если класс контекстно привязанные имеет SynchronizationAttribute.This can be useful when the context-bound class has SynchronizationAttribute. В этом случае все вызовы к членам класса автоматически синхронизируются и области синхронизации находится в теле код для класса.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. Если в стеке вызовов элемента вызывается WaitAny метода с указанием true для exitContext, поток выходит из области синхронизации, позволяя потоку, который блокируется во время вызова любого члена объекта для продолжения.If code in the call stack of a member calls the WaitAny 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. Когда WaitAny метод возвращает поток, которой был сделан вызов должен ожидать повторный ввод области синхронизации.When the WaitAny method returns, the thread that made the call must wait to reenter the synchronization domain.

Применяется к