WaitHandle.WaitAny メソッド
指定した配列内のいずれかの要素がシグナルを受信するまで待機します。
オーバーロードの一覧
指定した配列内のいずれかの要素がシグナルを受信するまで待機します。
[Visual Basic] Overloads Public Shared Function WaitAny(WaitHandle()) As Integer
[JScript] public static function WaitAny(WaitHandle[]) : int;
32 ビットの符号付き整数を使用して時間間隔を計測し、待機する前に同期ドメインを終了するかどうかを指定して、指定した配列内のいずれかの要素がシグナルを受信するまで待機します。
[Visual Basic] Overloads Public Shared Function WaitAny(WaitHandle(), Integer, Boolean) As Integer
[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++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。