WaitHandle.WaitTimeout フィールド
待機ハンドルがシグナル状態になる前に WaitAny 操作がタイムアウトになったことを示します。このフィールドは定数です。
Public Const WaitTimeout As Integer
[C#]
public const int WaitTimeout;
[C++]
public: const int WaitTimeout;
[JScript]
public var WaitTimeout : int;
解説
このフィールドは、 WaitAny の有効な戻り値の 1 つです。
使用例
[Visual Basic, C#, C++] スレッド プールを使用して、ファイルを複数のディスク上で同時に検索する方法の例を次に示します。ここでは、各ディスクのルート ディレクトリだけを検索します。
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, 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
[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, 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();
}
}
}
[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, 3000, 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++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ