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에서는 throw되지 않습니다.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.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
    
    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
End Class

' 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 메서드가 throw는 AbandonedMutexException 만 대기 작업이 완료 되 면 중단 된 뮤텍스 때문입니다.The WaitAny method throws an AbandonedMutexException only when the wait completes because of an abandoned mutex. 하는 경우 waitHandles 중단된 된 뮤텍스를 보다 낮은 인덱스 번호를 사용 하 여 출시 된 뮤텍스를 포함 합니다 WaitAny 메서드가 정상적으로 완료 되 고 예외가 throw 되지 않습니다.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 는 0 대신 128입니다.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 throw 됩니다.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.

반환

대기를 만족하는 개체의 배열 인덱스이거나 대기를 만족하는 개체가 없고 millisecondsTimeout과 동일한 시간 간격이 전달된 경우 WaitTimeout입니다.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에서는 throw되지 않습니다.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 가 0 이면 메서드는 차단 하지 않습니다.If millisecondsTimeout is zero, the method does not block. 대기 핸들의 상태를 테스트 하 고 즉시 반환 합니다.It tests the state of the wait handles and returns immediately.

합니다 WaitAny 메서드가 throw는 AbandonedMutexException 만 대기 작업이 완료 되 면 중단 된 뮤텍스 때문입니다.The WaitAny method throws an AbandonedMutexException only when the wait completes because of an abandoned mutex. 하는 경우 waitHandles 중단된 된 뮤텍스를 보다 낮은 인덱스 번호를 사용 하 여 출시 된 뮤텍스를 포함 합니다 WaitAny 메서드가 정상적으로 완료 되 고 예외가 throw 되지 않습니다.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 throw 됩니다.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이거나, 무한 대기하도록 -1밀리초를 나타내는 TimeSpan입니다.A TimeSpan that represents the number of milliseconds to wait, or a TimeSpan that represents -1 milliseconds to wait indefinitely.

반환

대기를 만족하는 개체의 배열 인덱스이거나 대기를 만족하는 개체가 없고 timeout과 동일한 시간 간격이 전달된 경우 WaitTimeout입니다.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- timeoutMaxValue보다 큰 경우timeout is greater than MaxValue.

스레드가 뮤텍스를 해제하지 않고 종료되었으므로 대기가 완료되었습니다.The wait completed because a thread exited without releasing a mutex. 이 예외가 Windows 98 또는 Windows Millennium Edition에서는 throw되지 않습니다.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 가 0 이면 메서드는 차단 하지 않습니다.If timeout is zero, the method does not block. 대기 핸들의 상태를 테스트 하 고 즉시 반환 합니다.It tests the state of the wait handles and returns immediately.

합니다 WaitAny 메서드가 throw는 AbandonedMutexException 만 대기 작업이 완료 되 면 중단 된 뮤텍스 때문입니다.The WaitAny method throws an AbandonedMutexException only when the wait completes because of an abandoned mutex. 하는 경우 waitHandles 중단된 된 뮤텍스를 보다 낮은 인덱스 번호를 사용 하 여 출시 된 뮤텍스를 포함 합니다 WaitAny 메서드가 정상적으로 완료 되 고 예외가 throw 되지 않습니다.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 throw 됩니다.On some implementations, if more that 64 handles are passed, a NotSupportedException is thrown.

에 대 한 최대값 timeoutInt32.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.

반환

대기를 만족하는 개체의 배열 인덱스이거나 대기를 만족하는 개체가 없고 millisecondsTimeout과 동일한 시간 간격이 전달된 경우 WaitTimeout입니다.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에서는 throw되지 않습니다.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 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 가 0 이면 메서드는 차단 하지 않습니다.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 메서드가 throw는 AbandonedMutexException 만 대기 작업이 완료 되 면 중단 된 뮤텍스 때문입니다.The WaitAny method throws an AbandonedMutexException only when the wait completes because of an abandoned mutex. 하는 경우 waitHandles 중단된 된 뮤텍스를 보다 낮은 인덱스 번호를 사용 하 여 출시 된 뮤텍스를 포함 합니다 WaitAny 메서드가 정상적으로 완료 되 고 예외가 throw 되지 않습니다.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 는 0 대신 128입니다.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 throw 됩니다.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이거나, 무한 대기하도록 -1밀리초를 나타내는 TimeSpan입니다.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.

반환

대기를 만족하는 개체의 배열 인덱스이거나 대기를 만족하는 개체가 없고 timeout과 동일한 시간 간격이 전달된 경우 WaitTimeout입니다.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- timeoutMaxValue보다 큰 경우timeout is greater than MaxValue.

스레드가 뮤텍스를 해제하지 않고 종료되었으므로 대기가 완료되었습니다.The wait completed because a thread exited without releasing a mutex. 이 예외가 Windows 98 또는 Windows Millennium Edition에서는 throw되지 않습니다.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 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 가 0 이면 메서드는 차단 하지 않습니다.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 메서드가 throw는 AbandonedMutexException 만 대기 작업이 완료 되 면 중단 된 뮤텍스 때문입니다.The WaitAny method throws an AbandonedMutexException only when the wait completes because of an abandoned mutex. 하는 경우 waitHandles 중단된 된 뮤텍스를 보다 낮은 인덱스 번호를 사용 하 여 출시 된 뮤텍스를 포함 합니다 WaitAny 메서드가 정상적으로 완료 되 고 예외가 throw 되지 않습니다.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 는 0 대신 128입니다.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 throw 됩니다.On some implementations, if more that 64 handles are passed, a NotSupportedException is thrown.

에 대 한 최대값 timeoutInt32.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.

적용 대상