Export (0) Print
Expand All

WaitHandle.WaitAny Method

Waits for any of the elements in the specified array to receive a signal.

Overload List

Waits for any of the elements in the specified array to receive a signal.

[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;

Waits for any of the elements in the specified array to receive a signal, using a 32-bit signed integer to measure the time interval, and specifying whether to exit the synchronization domain before the wait.

[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;

Waits for any of the elements in the specified array to receive a signal, using a TimeSpan to measure the time interval and specifying whether to exit the synchronization domain before the wait.

[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;

Example

[Visual Basic, C#, C++] 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.

[Visual Basic, C#, C++] Note   This example shows how to use one of the overloaded versions of WaitAny. For other examples that might be available, see the individual overload topics.
[Visual Basic] 
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] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button Language Filter in the upper-left corner of the page.

See Also

WaitHandle Class | WaitHandle Members | System.Threading Namespace

Show:
© 2014 Microsoft