次の方法で共有


WaitHandle.WaitAll メソッド

定義

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

オーバーロード

名前 説明
WaitAll(WaitHandle[], TimeSpan, Boolean)

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

WaitAll(WaitHandle[], Int32, Boolean)

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

WaitAll(WaitHandle[], TimeSpan)

TimeSpan値を使用して時間間隔を指定し、指定した配列内のすべての要素がシグナルを受信するまで待機します。

WaitAll(WaitHandle[], Int32)

Int32値を使用して時間間隔を指定し、指定した配列内のすべての要素がシグナルを受信するまで待機します。

WaitAll(WaitHandle[])

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

WaitAll(WaitHandle[], TimeSpan, Boolean)

ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs

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

public:
 static bool WaitAll(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, TimeSpan timeout, bool exitContext);
public static bool WaitAll(System.Threading.WaitHandle[] waitHandles, TimeSpan timeout, bool exitContext);
static member WaitAll : System.Threading.WaitHandle[] * TimeSpan * bool -> bool
Public Shared Function WaitAll (waitHandles As WaitHandle(), timeout As TimeSpan, exitContext As Boolean) As Boolean

パラメーター

waitHandles
WaitHandle[]

現在のインスタンスが待機するオブジェクトを含む WaitHandle 配列。 この配列には、同じオブジェクトへの複数の参照を含めることはできません。

timeout
TimeSpan

待機するミリ秒数を表す TimeSpan 、または無期限に待機する -1 ミリ秒を表す TimeSpan

exitContext
Boolean

true 待機前のコンテキストの同期ドメインを終了し (同期されたコンテキストの場合)、後で再取得します。それ以外の場合は false

返品

true waitHandlesのすべての要素がシグナルを受信した場合は。それ以外の場合はfalse

例外

waitHandles パラメーターはnull

-又は-

waitHandles配列内の 1 つ以上のオブジェクトがnull

-又は-

waitHandles は要素のない配列であり、.NET Framework バージョンは 2.0 以降です。

waitHandles配列には、重複する要素が含まれています。

waitHandles内のオブジェクトの数が、システムで許可されている数を超える。

-又は-

STAThreadAttribute属性は現在のスレッドのスレッド プロシージャに適用され、waitHandlesには複数の要素が含まれています。

waitHandles は要素のない配列であり、.NET Framework バージョンは 1.0 または 1.1 です。

timeout は、無限タイムアウトを表す、-1 ミリ秒以外の負の数です。

-又は-

timeoutInt32.MaxValue より大きい。

ミューテックスを解放せずにスレッドが終了したため、待機が終了しました。

waitHandles配列には、別のアプリケーション ドメイン内のWaitHandleの透過的なプロキシが含まれています。

次のコード例は、スレッド プールを使用して非同期的に作成し、ファイルのグループに書き込む方法を示しています。 各書き込み操作は作業項目としてキューに登録され、完了すると通知されます。 メイン スレッドは、すべての項目が通知されるまで待機してから終了します。

using System;
using System.IO;
using System.Security.Permissions;
using System.Threading;

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();
        }
    }
}
Imports System.IO
Imports System.Security.Permissions
Imports System.Threading

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

注釈

timeoutが 0 の場合、メソッドはブロックしません。 待機ハンドルの状態をテストし、すぐに返します。

ミューテックスが破棄されると、 AbandonedMutexException がスローされます。 破棄されたミューテックスは、多くの場合、重大なコーディング エラーを示します。 システム全体のミューテックスの場合、アプリケーションが突然終了したことを示している可能性があります (たとえば、Windows タスク マネージャーを使用)。 例外には、デバッグに役立つ情報が含まれています。

WaitAll メソッドは、待機が終了すると返されます。つまり、すべてのハンドルがシグナル通知されるか、タイムアウトが発生します。 64 個を超えるハンドルが渡されると、 NotSupportedException がスローされます。 配列に重複が含まれている場合、呼び出しは失敗します。

Note

WaitAll メソッドは、STA状態のスレッドではサポートされていません。

timeoutの最大値はInt32.MaxValue

コンテキストの終了

このメソッドが既定以外のマネージド コンテキスト内から呼び出されない限り、 exitContext パラメーターは無効です。 スレッドが ContextBoundObjectから派生したクラスのインスタンスの呼び出し内にある場合、マネージド コンテキストは既定以外の場合があります。 Stringなど、ContextBoundObjectから派生していないクラスで現在メソッドを実行している場合でも、ContextBoundObjectが現在のアプリケーション ドメイン内のスタック上にある場合は、既定以外のコンテキストにすることができます。

コードが既定以外のコンテキストで実行されている場合、exitContexttrueを指定すると、このメソッドを実行する前に、既定以外のマネージド コンテキスト (つまり、既定のコンテキストに遷移) が終了します。 このメソッドの呼び出しが完了すると、スレッドは元の既定以外のコンテキストに戻ります。

コンテキストを終了すると、コンテキスト バインド クラスに SynchronizationAttribute 属性がある場合に便利です。 その場合、クラスのメンバーに対するすべての呼び出しが自動的に同期され、同期ドメインはクラスのコード全体です。 メンバーの呼び出し履歴内のコードがこのメソッドを呼び出し、exitContexttrueを指定すると、スレッドは同期ドメインを終了します。これにより、オブジェクトの任意のメンバーへの呼び出しでブロックされているスレッドを続行できます。 このメソッドが戻るときに、呼び出しを行ったスレッドは、同期ドメインの再入力を待機する必要があります。

適用対象

WaitAll(WaitHandle[], Int32, Boolean)

ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs

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

public:
 static bool WaitAll(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, int millisecondsTimeout, bool exitContext);
public static bool WaitAll(System.Threading.WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext);
static member WaitAll : System.Threading.WaitHandle[] * int * bool -> bool
Public Shared Function WaitAll (waitHandles As WaitHandle(), millisecondsTimeout As Integer, exitContext As Boolean) As Boolean

パラメーター

waitHandles
WaitHandle[]

現在のインスタンスが待機するオブジェクトを含む WaitHandle 配列。 この配列には、同じオブジェクトへの複数の参照 (重複) を含めることはできません。

millisecondsTimeout
Int32

待機するミリ秒数、または無期限に待機する Infinite (-1)。

exitContext
Boolean

true 待機前のコンテキストの同期ドメインを終了し (同期されたコンテキストの場合)、後で再取得します。それ以外の場合は false

返品

true waitHandles内のすべての要素がシグナルを受信した場合は。それ以外の場合はfalse

例外

waitHandles パラメーターはnull

-又は-

waitHandles配列内の 1 つ以上のオブジェクトがnull

-又は-

waitHandles は要素のない配列であり、.NET Framework バージョンは 2.0 以降です。

waitHandles配列には、重複する要素が含まれています。

waitHandles内のオブジェクトの数が、システムで許可されている数を超える。

-又は-

現在のスレッドは STA 状態であり、 waitHandles には複数の要素が含まれています。

waitHandles は要素のない配列であり、.NET Framework バージョンは 1.0 または 1.1 です。

millisecondsTimeout は-1 以外の負の数で、無限タイムアウトを表します。

ミューテックスを解放せずにスレッドが終了したため、待機が完了しました。

waitHandles配列には、別のアプリケーション ドメイン内のWaitHandleの透過的なプロキシが含まれています。

次のコード例は、スレッド プールを使用して非同期的に作成し、ファイルのグループに書き込む方法を示しています。 各書き込み操作は作業項目としてキューに登録され、完了すると通知されます。 メイン スレッドは、すべての項目が通知されるまで待機してから終了します。

using System;
using System.IO;
using System.Security.Permissions;
using System.Threading;

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, 5000, 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();
        }
    }
}
Imports System.IO
Imports System.Security.Permissions
Imports System.Threading

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, 5000, 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

注釈

millisecondsTimeoutが 0 の場合、メソッドはブロックしません。 待機ハンドルの状態をテストし、すぐに返します。

ミューテックスが破棄されると、 AbandonedMutexException がスローされます。 破棄されたミューテックスは、多くの場合、重大なコーディング エラーを示します。 システム全体のミューテックスの場合、アプリケーションが突然終了したことを示している可能性があります (たとえば、Windows タスク マネージャーを使用)。 例外には、デバッグに役立つ情報が含まれています。

WaitAll メソッドは、待機が終了すると返されます。つまり、すべてのハンドルが通知されたとき、またはタイムアウトが発生した場合です。 64 個を超えるハンドルが渡されると、 NotSupportedException がスローされます。 配列に重複がある場合、呼び出しは DuplicateWaitObjectExceptionで失敗します。

Note

WaitAll メソッドは、STA状態のスレッドではサポートされていません。

コンテキストの終了

このメソッドが既定以外のマネージド コンテキスト内から呼び出されない限り、 exitContext パラメーターは無効です。 スレッドが ContextBoundObjectから派生したクラスのインスタンスの呼び出し内にある場合、マネージド コンテキストは既定以外の場合があります。 Stringなど、ContextBoundObjectから派生していないクラスで現在メソッドを実行している場合でも、ContextBoundObjectが現在のアプリケーション ドメイン内のスタック上にある場合は、既定以外のコンテキストにすることができます。

コードが既定以外のコンテキストで実行されている場合、exitContexttrueを指定すると、このメソッドを実行する前に、既定以外のマネージド コンテキスト (つまり、既定のコンテキストに遷移) が終了します。 このメソッドの呼び出しが完了すると、スレッドは元の既定以外のコンテキストに戻ります。

コンテキストを終了すると、コンテキスト バインド クラスに SynchronizationAttribute 属性がある場合に便利です。 その場合、クラスのメンバーに対するすべての呼び出しが自動的に同期され、同期ドメインはクラスのコード全体です。 メンバーの呼び出し履歴内のコードがこのメソッドを呼び出し、exitContexttrueを指定すると、スレッドは同期ドメインを終了します。これにより、オブジェクトの任意のメンバーへの呼び出しでブロックされているスレッドを続行できます。 このメソッドが戻るときに、呼び出しを行ったスレッドは、同期ドメインの再入力を待機する必要があります。

適用対象

WaitAll(WaitHandle[], TimeSpan)

ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs

TimeSpan値を使用して時間間隔を指定し、指定した配列内のすべての要素がシグナルを受信するまで待機します。

public:
 static bool WaitAll(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, TimeSpan timeout);
public static bool WaitAll(System.Threading.WaitHandle[] waitHandles, TimeSpan timeout);
static member WaitAll : System.Threading.WaitHandle[] * TimeSpan -> bool
Public Shared Function WaitAll (waitHandles As WaitHandle(), timeout As TimeSpan) As Boolean

パラメーター

waitHandles
WaitHandle[]

現在のインスタンスが待機するオブジェクトを含む WaitHandle 配列。 この配列には、同じオブジェクトへの複数の参照を含めることはできません。

timeout
TimeSpan

待機するミリ秒数を表す TimeSpan 、または無期限に待機する -1 ミリ秒を表す TimeSpan

返品

true waitHandles内のすべての要素がシグナルを受信した場合は。それ以外の場合はfalse

例外

waitHandles パラメーターはnull

-又は-

waitHandles配列内の 1 つ以上のオブジェクトがnull

-又は-

waitHandles は要素のない配列です。

waitHandles配列には、重複する要素が含まれています。

waitHandles内のオブジェクトの数が、システムで許可されている数を超える。

-又は-

現在のスレッドは STA 状態であり、 waitHandles には複数の要素が含まれています。

timeout は、無限タイムアウトを表す、-1 ミリ秒以外の負の数です。

-又は-

timeoutInt32.MaxValue より大きい。

ミューテックスを解放せずにスレッドが終了したため、待機が終了しました。

waitHandles配列には、別のアプリケーション ドメイン内のWaitHandleの透過的なプロキシが含まれています。

注釈

timeoutが 0 の場合、メソッドはブロックしません。 待機ハンドルの状態をテストし、すぐに返します。

WaitAll メソッドは、待機が終了すると返されます。つまり、すべてのハンドルがシグナル通知されるか、タイムアウトが発生します。 64 個を超えるハンドルが渡されると、 NotSupportedException がスローされます。 配列に重複が含まれている場合、呼び出しは失敗します。

Note

WaitAll メソッドは、STA状態のスレッドではサポートされていません。

timeoutの最大値はInt32.MaxValue

このメソッド オーバーロードの呼び出しは、WaitAll(WaitHandle[], TimeSpan, Boolean) オーバーロードを呼び出し、exitContextfalseを指定するのと同じです。

適用対象

WaitAll(WaitHandle[], Int32)

ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs

Int32値を使用して時間間隔を指定し、指定した配列内のすべての要素がシグナルを受信するまで待機します。

public:
 static bool WaitAll(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, int millisecondsTimeout);
public static bool WaitAll(System.Threading.WaitHandle[] waitHandles, int millisecondsTimeout);
static member WaitAll : System.Threading.WaitHandle[] * int -> bool
Public Shared Function WaitAll (waitHandles As WaitHandle(), millisecondsTimeout As Integer) As Boolean

パラメーター

waitHandles
WaitHandle[]

現在のインスタンスが待機するオブジェクトを含む WaitHandle 配列。 この配列には、同じオブジェクトへの複数の参照 (重複) を含めることはできません。

millisecondsTimeout
Int32

待機するミリ秒数、または無期限に待機する Infinite (-1)。

返品

true waitHandles内のすべての要素がシグナルを受信した場合は。それ以外の場合はfalse

例外

waitHandles パラメーターはnull

-又は-

waitHandles配列内の 1 つ以上のオブジェクトがnull

-又は-

waitHandles は要素のない配列です。

waitHandles配列には、重複する要素が含まれています。

waitHandles内のオブジェクトの数が、システムで許可されている数を超える。

-又は-

現在のスレッドは STA 状態であり、 waitHandles には複数の要素が含まれています。

millisecondsTimeout は-1 以外の負の数で、無限タイムアウトを表します。

ミューテックスを解放せずにスレッドが終了したため、待機が完了しました。

waitHandles配列には、別のアプリケーション ドメイン内のWaitHandleの透過的なプロキシが含まれています。

注釈

millisecondsTimeoutが 0 の場合、メソッドはブロックしません。 待機ハンドルの状態をテストし、すぐに返します。

WaitAll メソッドは、待機が終了すると返されます。つまり、すべてのハンドルが通知されたとき、またはタイムアウトが発生した場合です。 64 個を超えるハンドルが渡されると、 NotSupportedException がスローされます。 配列に重複がある場合、呼び出しは DuplicateWaitObjectExceptionで失敗します。

Note

WaitAll メソッドは、STA状態のスレッドではサポートされていません。

このメソッド オーバーロードの呼び出しは、WaitAll(WaitHandle[], Int32, Boolean) オーバーロードを呼び出し、exitContextfalseを指定するのと同じです。

適用対象

WaitAll(WaitHandle[])

ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs
ソース:
WaitHandle.cs

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

public:
 static bool WaitAll(cli::array <System::Threading::WaitHandle ^> ^ waitHandles);
public static bool WaitAll(System.Threading.WaitHandle[] waitHandles);
static member WaitAll : System.Threading.WaitHandle[] -> bool
Public Shared Function WaitAll (waitHandles As WaitHandle()) As Boolean

パラメーター

waitHandles
WaitHandle[]

現在のインスタンスが待機するオブジェクトを含む WaitHandle 配列。 この配列には、同じオブジェクトへの複数の参照を含めることはできません。

返品

true waitHandles内のすべての要素がシグナルを受信した場合。それ以外の場合、メソッドは返されません。

例外

waitHandles パラメーターはnull。 -又は-

waitHandles配列内の 1 つ以上のオブジェクトがnull

-又は-

waitHandles は要素のない配列であり、.NET Framework バージョンは 2.0 以降です。

waitHandles配列には、重複する要素が含まれています。

waitHandles内のオブジェクトの数が、システムで許可されている数を超える。

-又は-

現在のスレッドは STA 状態であり、 waitHandles には複数の要素が含まれています。

waitHandles は要素のない配列であり、.NET Framework バージョンは 1.0 または 1.1 です。

ミューテックスを解放せずにスレッドが終了したため、待機が終了しました。

waitHandles配列には、別のアプリケーション ドメイン内のWaitHandleの透過的なプロキシが含まれています。

次のコード例は、スレッド プールを使用して非同期的に作成し、ファイルのグループに書き込む方法を示しています。 各書き込み操作は作業項目としてキューに登録され、完了すると通知されます。 メイン スレッドは、すべての項目が通知されるまで待機してから終了します。

using System;
using System.IO;
using System.Security.Permissions;
using System.Threading;

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.
        WaitHandle.WaitAll(manualEvents);
        Console.WriteLine("Files written - 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();
        }
    }
}
Imports System.IO
Imports System.Security.Permissions
Imports System.Threading

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.
        WaitHandle.WaitAll(manualEvents)
        Console.WriteLine("Files written - main exiting.")
    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

注釈

AbandonedMutexException は.NET Framework バージョン 2.0 の新機能です。 以前のバージョンでは、ミューテックスが破棄されたときに、 WaitAll メソッドは true を返します。 破棄されたミューテックスは、多くの場合、重大なコーディング エラーを示します。 システム全体のミューテックスの場合、アプリケーションが突然終了したことを示している可能性があります (たとえば、Windows タスク マネージャーを使用)。 例外には、デバッグに役立つ情報が含まれています。

WaitAll メソッドは、すべてのハンドルが通知されると返されます。 64 個を超えるハンドルが渡されると、 NotSupportedException がスローされます。 配列に重複が含まれている場合、呼び出しは DuplicateWaitObjectExceptionで失敗します。

Note

WaitAll メソッドは、STA状態のスレッドではサポートされていません。

このメソッド オーバーロードの呼び出しは、WaitAll(WaitHandle[], Int32, Boolean) メソッドオーバーロードを呼び出し、exitContextmillisecondsTimeouttrueに -1 (またはTimeout.Infinite) を指定することと同じです。

適用対象