次の方法で共有


WaitHandle.WaitAny メソッド

指定した配列内のいずれかの要素がシグナルを受信するまで待機します。

オーバーロードの一覧

指定した配列内のいずれかの要素がシグナルを受信するまで待機します。

[Visual Basic] Overloads Public Shared Function WaitAny(WaitHandle()) As Integer

[C#] public static int WaitAny(WaitHandle[]);

[C++] public: static int WaitAny(WaitHandle*[]);

[JScript] public static function WaitAny(WaitHandle[]) : int;

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

[Visual Basic] Overloads Public Shared Function WaitAny(WaitHandle(), Integer, Boolean) As Integer

[C#] public static int WaitAny(WaitHandle[], int, bool);

[C++] public: static int WaitAny(WaitHandle*[], int, bool);

[JScript] public static function WaitAny(WaitHandle[], int, Boolean) : int;

TimeSpan を使用して時間間隔を計測し、待機する前に同期ドメインを終了するかどうかを指定して、指定した配列内のいずれかの要素がシグナルを受信するまで待機します。

[Visual Basic] Overloads Public Shared Function WaitAny(WaitHandle(), TimeSpan, Boolean) As Integer

[C#] public static int WaitAny(WaitHandle[], TimeSpan, bool);

[C++] public: static int WaitAny(WaitHandle*[], TimeSpan, bool);

[JScript] public static function WaitAny(WaitHandle[], TimeSpan, Boolean) : int;

使用例

[Visual Basic, C#, C++] スレッド プールを使用して、ファイルを複数のディスク上で同時に検索する方法の例を次に示します。ここでは、各ディスクのルート ディレクトリだけを検索します。

[Visual Basic, C#, C++] メモ   ここでは、WaitAny のオーバーロード形式のうちの 1 つだけについて、使用例を示します。その他の例については、各オーバーロード形式のトピックを参照してください。

 
Imports Microsoft.VisualBasic
Imports System
Imports System.IO
Imports System.Threading

Public Class Test
    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

[C#] 
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();
        }
    }
}

[C++] 
#using <mscorlib.dll>
using namespace System;
using namespace System::IO;
using namespace System::Threading;

__gc class Search
{
    // Maintain state information to pass to FindCallback.
    __gc class State
    {
    public:
        AutoResetEvent* autoEvent;
        String*         fileName;

        State(AutoResetEvent* autoEvent, String* fileName) : 
            autoEvent(autoEvent), fileName(fileName) {}
    };

    AutoResetEvent* autoEvents __gc[];
    String* diskLetters __gc[];

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

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

        autoEvents = new AutoResetEvent* __gc[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.
    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(
                this, &Search::FindCallback), new 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(S"\n{0} not found.", fileName);
        }
        else
        {
            Console::WriteLine(S"\n{0} found on {1}.", fileName,
                diskLetters[index]);
        }
    }
};

void main()
{
    Search* search = new Search();
    search->FindFile(S"SomeFile.dat");
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

参照

WaitHandle クラス | WaitHandle メンバ | System.Threading 名前空間