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 配列内の 1 つ以上のオブジェクトが 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.

.NET Framework のバージョンが 1.0 または 1.1 であるにもかかわらず、waitHandles が要素のない配列です。 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.

.NET Framework のバージョンが 2.0 以降であるにもかかわらず、waitHandles が要素のない配列です。 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 version 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は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. 呼び出し中に 1 つ以上のオブジェクトがシグナル状態に場合、は、シグナル状態のすべてのオブジェクトの最小のインデックス値を含むシグナル状態のオブジェクトの配列インデックスを返します。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) のmillisecondsTimeouttrueexitContextします。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 配列内の 1 つ以上のオブジェクトが 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が 0 の場合、メソッドはブロックしません。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. 呼び出し中に 1 つ以上のオブジェクトがシグナル状態に場合、は、シグナル状態のすべてのオブジェクトの最小のインデックス値を含むシグナル状態のオブジェクトの配列インデックスを返します。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)オーバー ロードを指定してfalseexitContextします。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 配列内の 1 つ以上のオブジェクトが 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 では、この例外はスローされません。 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メソッドがスローされます、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. 呼び出し中に 1 つ以上のオブジェクトがシグナル状態に場合、は、シグナル状態のすべてのオブジェクトの最小のインデックス値を含むシグナル状態のオブジェクトの配列インデックスを返します。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.

最大値timeoutInt32.MaxValueします。The maximum value for timeout is Int32.MaxValue.

呼び出しと同じには、このメソッドのオーバー ロードを呼び出し、WaitAny(WaitHandle[], TimeSpan, Boolean)オーバー ロードを指定してfalseexitContextします。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 配列内の 1 つ以上のオブジェクトが 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.

.NET Framework のバージョンが 1.0 または 1.1 であるにもかかわらず、waitHandles が要素のない配列です。 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.

.NET Framework のバージョンが 2.0 以降であるにもかかわらず、waitHandles が要素のない配列です。 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が 0 の場合、メソッドはブロックしません。If millisecondsTimeout is zero, the method does not block. これにより、待機ハンドルの状態をテストし、すぐに返します。It tests the state of the wait handles and returns immediately.

AbandonedMutexException .NET Framework version 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は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. 呼び出し中に 1 つ以上のオブジェクトがシグナル状態に場合、は、シグナル状態のすべてのオブジェクトの最小のインデックス値を含むシグナル状態のオブジェクトの配列インデックスを返します。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.

既定以外のコンテキストでコードを実行しているときに指定するtrueexitContextが原因で、既定以外の管理コンテキストを終了するスレッド (つまり、既定のコンテキストへの移行) 実行する前に、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メソッドを指定してtrueexitContextスレッドが続行する、オブジェクトのすべてのメンバーへの呼び出しでブロックされているスレッドを許可する、同期ドメインを終了します。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 配列内の 1 つ以上のオブジェクトが 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.

.NET Framework のバージョンが 1.0 または 1.1 であるにもかかわらず、waitHandles が要素のない配列です。 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 では、この例外はスローされません。 This exception is not thrown on Windows 98 or Windows Millennium Edition.

.NET Framework のバージョンが 2.0 以降であるにもかかわらず、waitHandles が要素のない配列です。 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が 0 の場合、メソッドはブロックしません。If timeout is zero, the method does not block. これにより、待機ハンドルの状態をテストし、すぐに返します。It tests the state of the wait handles and returns immediately.

AbandonedMutexException .NET Framework version 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は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. 呼び出し中に 1 つ以上のオブジェクトがシグナル状態に場合、は、シグナル状態のすべてのオブジェクトの最小のインデックス値を含むシグナル状態のオブジェクトの配列インデックスを返します。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.

最大値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.

既定以外のコンテキストでコードを実行しているときに指定するtrueexitContextが原因で、既定以外の管理コンテキストを終了するスレッド (つまり、既定のコンテキストへの移行) 実行する前に、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メソッドを指定してtrueexitContextスレッドが続行する、オブジェクトのすべてのメンバーへの呼び出しでブロックされているスレッドを許可する、同期ドメインを終了します。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.

適用対象