この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

WaitHandle.WaitAny メソッド (WaitHandle[], Int32, Boolean)

 

公開日: 2016年10月

32 ビットの符号付き整数を使用して時間間隔を指定し、待機する前に同期ドメインを終了するかどうかを指定して、指定した配列内のいずれかの要素がシグナルを受信するまで待機します。

名前空間:   System.Threading
アセンブリ:  mscorlib (mscorlib.dll 内)

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

パラメーター

waitHandles
Type: System.Threading.WaitHandle[]

現在のインスタンスが待機する対象のオブジェクトを格納している WaitHandle 配列。

millisecondsTimeout
Type: System.Int32

待機するミリ秒数。無制限に待機する場合は Timeout.Infinite (-1)。

exitContext
Type: System.Boolean

待機する前にコンテキストの同期ドメインを終了し (同期されたコンテキスト内にいる場合)、後で再取得する場合は、true。それ以外の場合は false

戻り値

Type: System.Int32

待機を実行したオブジェクトの配列インデックス。または、待機を実行したオブジェクトがなく millisecondsTimeout に等しい時間間隔が経過した場合は WaitTimeout となります。

Exception Condition
ArgumentNullException

waitHandles パラメーターが null です。

または

1 つ以上のオブジェクトの waitHandles 配列が nullです。

NotSupportedException

オブジェクトの数 waitHandles が超える場合、システムで許可されています。

ApplicationException

waitHandles 要素を持たない配列は、.NET Framework のバージョンは 1.0 または 1.1 です。

ArgumentOutOfRangeException

millisecondsTimeout は無限のタイムアウトを表す -1 以外の負の数です。

AbandonedMutexException

ミュー テックスを解放しないままスレッドが終了したため、完了の待機です。 Windows 98 または Windows Millennium Edition では、この例外はスローされません。

ArgumentException

waitHandles 要素を持たない配列は、.NET Framework のバージョンが 2.0 以降。

InvalidOperationException

waitHandles の透過的なプロキシが配列に含まれる、 WaitHandle 別のアプリケーション ドメイン。

場合 millisecondsTimeout 0 の場合は、このメソッドはブロックされません。 待機ハンドルの状態をテストし、直ちに返されます。

AbandonedMutexException .NET Framework version 2.0 の新機能です。 以前のバージョンで、 WaitAny メソッドが返す true ミュー テックスを破棄するために、待機が終了した場合。 ミュー テックスの破棄は、多くの場合、深刻なコーディング エラーを示します。 システム全体のミュー テックス可能性があります (たとえば、Windows タスク マネージャーを使用して) をアプリケーションが突然終了されたことを示します。 この例外には、デバッグに役立つ情報が含まれています。

WaitAny メソッドでのスロー、 AbandonedMutexException ミュー テックスの破棄のため、待機が完了したときにのみです。 場合 waitHandles 放棄されたミュー テックスよりも小さいインデックス数字がリリースされたミュー テックスを含む、 WaitAny メソッドが正常に完了して、例外はスローされません。

System_CAPS_noteメモ

.NET Framework バージョン 2.0 では、スレッドが終了するか明示的に解放することがなくを中止する場合よりも前のバージョンで、 Mutex, 、および Mutex で 0 (ゼロ) のインデックス位置にある、 WaitAny 別のスレッドによって返されるインデックスで配列 WaitAny 0 ではなく 128 です。

このメソッドは、ハンドルがシグナル状態になるとき、またはタイムアウトが発生したときに、待機が終了するときに返します。 呼び出し時に 1 つ以上のオブジェクトがシグナル状態に場合、は、シグナル状態のすべてのオブジェクトの最小のインデックス値を含むシグナル状態のオブジェクトの配列インデックスを返します。 複数 64 ハンドルが渡される場合、一部の実装で、 NotSupportedException がスローされます。

exitContext パラメーターも何も起こりませんしない限り、 WaitAny 既定以外の管理コンテキスト内から呼び出されます。 これが起こる場合、スレッドがから派生したクラスのインスタンスへの呼び出し ContextBoundObjectします。 派生していないクラスのメソッドを実行する現在場合でも ContextBoundObject, と同様に String, 、既定以外のコンテキストでサービスできる場合、 ContextBoundObject が現在のアプリケーション ドメインで、スタック上にします。

既定以外のコンテキストでコードを実行するとときに、指定する trueexitContext が原因で、既定以外の管理コンテキストを終了するスレッド (は、既定のコンテキストへの移行に) 実行する前に、 WaitAny メソッドです。 スレッドが呼び出しの後に元の既定以外のコンテキストに戻る、 WaitAny メソッドが完了するとします。

これは、便利な場合、コンテキスト バインド クラスには SynchronizationAttributeです。 この場合は、クラスのメンバーに対するすべての呼び出しを自動的に同期され、同期ドメインは、クラスのコードの本文全体です。 メンバーの呼び出し履歴内のコードを呼び出すかどうか、 WaitAny メソッドを指定して trueexitContext, 、スレッドが続行する、オブジェクトの任意のメンバーへの呼び出しでブロックされているスレッドの同期ドメインを終了します。 ときに、 WaitAny メソッドが戻る同期ドメインを再入力する呼び出しを行ったスレッドが待機する必要があります。

次のコード例では、スレッド プールを使用して、同時に複数のディスク上のファイルを検索する方法を示します。 領域の構成については、各ディスクのルート ディレクトリだけが検索されます。

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

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

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

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

    AutoResetEvent[] autoEvents;
    String[] diskLetters;

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

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

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

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

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

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

.NET Framework
1.1 以降で使用可能
トップに戻る
表示: