このドキュメントはアーカイブされており、メンテナンスされていません。

WaitHandle.WaitAll メソッド (WaitHandle[])

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

名前空間: System.Threading
アセンブリ: mscorlib (mscorlib.dll 内)

public static bool WaitAll (
	WaitHandle[] waitHandles
)
public static boolean WaitAll (
	WaitHandle[] waitHandles
)
public static function WaitAll (
	waitHandles : WaitHandle[]
) : boolean
適用できません。

パラメータ

waitHandles

現在のインスタンスが待機する対象のオブジェクトを格納している WaitHandle 配列。この配列には、同一オブジェクトに対する複数の参照を含めることはできません。

戻り値

waitHandles 内のすべての要素がシグナルを受信した場合は true。それ以外の場合は、待機を続けます。

例外の種類条件

ArgumentNullException

waitHandles パラメータが null 参照 (Visual Basic では Nothing) です。または

waitHandles 配列内の 1 つ以上のオブジェクトが null 参照 (Visual Basic では Nothing) です。

または

.NET Framework のバージョンが 2.0 であるにもかかわらず、waitHandles が要素のない配列です。

DuplicateWaitObjectException

waitHandles 配列に、重複する要素が格納されています。

NotSupportedException

waitHandles 内のオブジェクト数がシステムによって許可されている数を超えています。

または

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

ApplicationException

.NET Framework のバージョンが 1.0 または 1.1 であるにもかかわらず、waitHandles が要素のない配列です。

AbandonedMutexException

スレッドがミューテックスを解放せずに終了したため、待機が終了しました。この例外は、Windows 98 および Windows Millennium Edition ではスローされません。

InvalidOperationException

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

AbandonedMutexException は、.NET Framework Version 2.0 で新しく導入されました。以前のバージョンでは、ミューテックスが放棄されると WaitAll メソッドは true を返します。放棄されたミューテックスは、深刻なコーディング エラーの存在を意味します。例外には、デバッグに役立つ情報が含まれています。

すべてのハンドルがシグナルを受信すると、WaitAll メソッドから制御が戻ります。一部の実装では、64 個を超えるハンドルが渡されると、NotSupportedException がスローされます。配列に重複が含まれていると、呼び出しは DuplicateWaitObjectException をスローして失敗します。

メモメモ :

WaitAll メソッドは、STAThreadAttribute を持つスレッドではサポートされていません。

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

スレッド プールを使用して、ファイルのグループの作成と、そのグループへの書き込みを非同期的に行う方法の例を次に示します。各書き込み操作は、作業項目としてキューに置かれ、終了すると通知を送信します。メイン スレッドは、すべての項目からの通知を待って終了します。

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.
        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();
        }
    }
}

import System.*;
import System.IO.*;
import System.Security.Permissions.*;
import System.Threading.*;
import System.Threading.Thread;

// Request permission to create and write files to C:\TestTest.
/** @assembly FileIOPermissionAttribute(SecurityAction.RequestMinimum,
    All = "C:\\TestTest")
 */

class Test
{
    public static void main(String[] args)
    {
        final int numberOfFiles = 5;
        String dirName = "C:\\TestTest";
        String fileName;
        ubyte 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", String.valueOf(i),
                ".dat");

            // Create random data to write to the file.
            byteArray = new ubyte[1000000];
            randomGenerator.NextBytes(byteArray);
            manualEvents.set_Item(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.");
    } //main
} //Test

// Maintain state to pass to WriteToFile.
class State
{
    public String fileName;
    public ubyte byteArray[];
    public ManualResetEvent manualEvent;

    public State(String fileName, ubyte byteArray[],
            ManualResetEvent manualEvent)
    {
        this.fileName = fileName;
        this.byteArray = byteArray;
        this.manualEvent = manualEvent;
    } //State
} //State

class Writer
{
    private static int workItemCount = 0;

    Writer()
    {
    } //Writer

    public static void WriteToFile(Object state)
    {
        int workItemNumber = workItemCount;

        Interlocked.Increment(workItemCount);
        Console.WriteLine("Starting work item {0}.",
            String.valueOf(workItemNumber));

        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}.", 
                String.valueOf(workItemNumber));
            stateInfo.manualEvent.Set();
      }
    } //WriteToFile
} //Writer

Windows 98,Windows Server 2000 SP4,Windows CE,Windows Millennium Edition,Windows Mobile for Pocket PC,Windows Mobile for Smartphone,Windows Server 2003,Windows XP Media Center Edition,Windows XP Professional x64 Edition,Windows XP SP2,Windows XP Starter Edition

Microsoft .NET Framework 3.0 は Windows Vista,Microsoft Windows XP SP2,および Windows Server 2003 SP1 でサポートされています。

.NET Framework

サポート対象 : 3.0,2.0,1.1,1.0
表示: