WaitHandle.WaitAll メソッド
指定した配列内のすべての要素がシグナルを受信するまで待機します。
オーバーロードの一覧
指定した配列内のすべての要素がシグナルを受信するまで待機します。
[Visual Basic] Overloads Public Shared Function WaitAll(WaitHandle()) As Boolean
[JScript] public static function WaitAll(WaitHandle[]) : Boolean;
Int32 値を使用して時間間隔を計測し、待機する前に同期ドメインを終了するかどうかを指定して、指定した配列内のすべての要素がシグナルを受信するまで待機します。
[Visual Basic] Overloads Public Shared Function WaitAll(WaitHandle(), Integer, Boolean) As Boolean
[C++] public: static bool WaitAll(WaitHandle*[], int, bool);
[JScript] public static function WaitAll(WaitHandle[], int, Boolean) : Boolean;
TimeSpan 値を使用して時間間隔を計測し、待機する前に同期ドメインを終了するかどうかを指定して、指定した配列内のすべての要素がシグナルを受信するまで待機します。
[Visual Basic] Overloads Public Shared Function WaitAll(WaitHandle(), TimeSpan, Boolean) As Boolean
[C#] public static bool WaitAll(WaitHandle[], TimeSpan, bool);
[C++] public: static bool WaitAll(WaitHandle*[], TimeSpan, bool);
[JScript] public static function WaitAll(WaitHandle[], TimeSpan, Boolean) : Boolean;
使用例
[Visual Basic, C#, C++] スレッド プールを使用して、ファイルのグループの作成と、そのグループへの書き込みを非同期的に行う方法の例を次に示します。各書き込み操作は、作業項目としてキューに置かれ、終了すると通知を送信します。メイン スレッドは、すべての項目からの通知を待って終了します。
[Visual Basic, C#, C++] メモ ここでは、WaitAll のオーバーロード形式のうちの 1 つだけについて、使用例を示します。その他の例については、各オーバーロード形式のトピックを参照してください。
Imports System
Imports System.IO
Imports System.Security.Permissions
Imports System.Threading
' Request permission to create and write files to C:\TestTest.
<Assembly: FileIOPermissionAttribute(SecurityAction.RequestMinimum, _
All := "C:\TestTest")>
Public Class Test
' WaitHandle.WaitAll requires a multithreaded apartment
' when using multiple wait handles.
<MTAThreadAttribute> _
Shared Sub Main()
Const numberOfFiles As Integer = 5
Dim dirName As String = "C:\TestTest"
Dim fileName As String
Dim byteArray() As Byte
Dim randomGenerator As New Random()
Dim manualEvents(numberOfFiles - 1) As ManualResetEvent
Dim stateInfo As State
If Directory.Exists(dirName) <> True Then
Directory.CreateDirectory(dirName)
End If
' Queue the work items that create and write to the files.
For i As Integer = 0 To numberOfFiles - 1
fileName = String.Concat( _
dirName, "\Test", i.ToString(), ".dat")
' Create random data to write to the file.
byteArray = New Byte(1000000){}
randomGenerator.NextBytes(byteArray)
manualEvents(i) = New ManualResetEvent(false)
stateInfo = _
New State(fileName, byteArray, manualEvents(i))
ThreadPool.QueueUserWorkItem(AddressOf _
Writer.WriteToFile, stateInfo)
Next i
' Since ThreadPool threads are background threads,
' wait for the work items to signal before exiting.
If WaitHandle.WaitAll( _
manualEvents, New TimeSpan(0, 0, 5), false) = True Then
Console.WriteLine("Files written - main exiting.")
Else
' The wait operation times out.
Console.WriteLine("Error writing files - main exiting.")
End If
End Sub
End Class
' Maintain state to pass to WriteToFile.
Public Class State
Public fileName As String
Public byteArray As Byte()
Public manualEvent As ManualResetEvent
Sub New(fileName As String, byteArray() As Byte, _
manualEvent As ManualResetEvent)
Me.fileName = fileName
Me.byteArray = byteArray
Me.manualEvent = manualEvent
End Sub
End Class
Public Class Writer
Private Sub New()
End Sub
Shared workItemCount As Integer = 0
Shared Sub WriteToFile(state As Object)
Dim workItemNumber As Integer = workItemCount
Interlocked.Increment(workItemCount)
Console.WriteLine("Starting work item {0}.", _
workItemNumber.ToString())
Dim stateInfo As State = CType(state, State)
Dim fileWriter As FileStream = Nothing
' Create and write to the file.
Try
fileWriter = New FileStream( _
stateInfo.fileName, FileMode.Create)
fileWriter.Write(stateInfo.byteArray, _
0, stateInfo.byteArray.Length)
Finally
If Not fileWriter Is Nothing Then
fileWriter.Close()
End If
' Signal Main that the work item has finished.
Console.WriteLine("Ending work item {0}.", _
workItemNumber.ToString())
stateInfo.manualEvent.Set()
End Try
End Sub
End Class
[C#]
using System;
using System.IO;
using System.Security.Permissions;
using System.Threading;
// Request permission to create and write files to C:\TestTest.
[assembly: FileIOPermissionAttribute(SecurityAction.RequestMinimum,
All = @"C:\TestTest")]
class Test
{
static void Main()
{
const int numberOfFiles = 5;
string dirName = @"C:\TestTest";
string fileName;
byte[] byteArray;
Random randomGenerator = new Random();
ManualResetEvent[] manualEvents =
new ManualResetEvent[numberOfFiles];
State stateInfo;
if(!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
// Queue the work items that create and write to the files.
for(int i = 0; i < numberOfFiles; i++)
{
fileName = string.Concat(
dirName, @"\Test", i.ToString(), ".dat");
// Create random data to write to the file.
byteArray = new byte[1000000];
randomGenerator.NextBytes(byteArray);
manualEvents[i] = new ManualResetEvent(false);
stateInfo =
new State(fileName, byteArray, manualEvents[i]);
ThreadPool.QueueUserWorkItem(new WaitCallback(
Writer.WriteToFile), stateInfo);
}
// Since ThreadPool threads are background threads,
// wait for the work items to signal before exiting.
if(WaitHandle.WaitAll(
manualEvents, new TimeSpan(0, 0, 5), false))
{
Console.WriteLine("Files written - main exiting.");
}
else
{
// The wait operation times out.
Console.WriteLine("Error writing files - main exiting.");
}
}
}
// Maintain state to pass to WriteToFile.
class State
{
public string fileName;
public byte[] byteArray;
public ManualResetEvent manualEvent;
public State(string fileName, byte[] byteArray,
ManualResetEvent manualEvent)
{
this.fileName = fileName;
this.byteArray = byteArray;
this.manualEvent = manualEvent;
}
}
class Writer
{
static int workItemCount = 0;
Writer() {}
public static void WriteToFile(object state)
{
int workItemNumber = workItemCount;
Interlocked.Increment(ref workItemCount);
Console.WriteLine("Starting work item {0}.",
workItemNumber.ToString());
State stateInfo = (State)state;
FileStream fileWriter = null;
// Create and write to the file.
try
{
fileWriter = new FileStream(
stateInfo.fileName, FileMode.Create);
fileWriter.Write(stateInfo.byteArray,
0, stateInfo.byteArray.Length);
}
finally
{
if(fileWriter != null)
{
fileWriter.Close();
}
// Signal Main that the work item has finished.
Console.WriteLine("Ending work item {0}.",
workItemNumber.ToString());
stateInfo.manualEvent.Set();
}
}
}
[C++]
#using <mscorlib.dll>
using namespace System;
using namespace System::IO;
using namespace System::Security::Permissions;
using namespace System::Threading;
// Request permission to create and write files to C:\TestTest.
[assembly: FileIOPermissionAttribute(SecurityAction::RequestMinimum,
All = "C:\\TestTest")];
// Maintain state to pass to WriteToFile.
__gc class State
{
public:
String* fileName;
Byte byteArray __gc [];
ManualResetEvent* manualEvent;
State(String* fileName, Byte byteArray __gc [],
ManualResetEvent* manualEvent) : fileName(fileName),
byteArray(byteArray), manualEvent(manualEvent) {}
};
__gc class Writer
{
static int workItemCount = 0;
Writer() {}
public:
static void WriteToFile(Object* state)
{
int workItemNumber = workItemCount;
Interlocked::Increment(&workItemCount);
Console::WriteLine(S"Starting work item {0}.",
workItemNumber.ToString());
State* stateInfo = dynamic_cast<State*>(state);
FileStream* fileWriter;
// Create and write to the file.
try
{
fileWriter = new FileStream(
stateInfo->fileName, FileMode::Create);
fileWriter->Write(stateInfo->byteArray,
0, stateInfo->byteArray->Length);
}
__finally
{
if(fileWriter != 0)
{
fileWriter->Close();
}
// Signal main() that the work item has finished.
Console::WriteLine(S"Ending work item {0}.",
workItemNumber.ToString());
stateInfo->manualEvent->Set();
}
}
};
void main()
{
const int numberOfFiles = 5;
String* dirName = "C:\\TestTest";
String* fileName;
Byte byteArray __gc [];
Random* randomGenerator = new Random();
ManualResetEvent* manualEvents __gc [] =
new ManualResetEvent* __gc [numberOfFiles];
State* stateInfo;
if(!Directory::Exists(dirName))
{
Directory::CreateDirectory(dirName);
}
// Queue the work items that create and write to the files.
for(int i = 0; i < numberOfFiles; i++)
{
fileName = String::Concat(
dirName, "\\Test", (i).ToString(), ".dat");
// Create random data to write to the file.
byteArray = new Byte __gc [1000000];
randomGenerator->NextBytes(byteArray);
manualEvents[i] = new ManualResetEvent(false);
stateInfo = new State(fileName, byteArray, manualEvents[i]);
ThreadPool::QueueUserWorkItem(new WaitCallback(
0, &Writer::WriteToFile), stateInfo);
}
// Since ThreadPool threads are background threads,
// wait for the work items to signal before exiting.
if(WaitHandle::WaitAll(manualEvents, TimeSpan(0, 0, 5), false))
{
Console::WriteLine(S"Files written - main exiting.");
}
else
{
// The wait operation times out.
Console::WriteLine(S"Error writing files - main exiting.");
}
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。