이 설명서는 보관되지만 유지 되지 않습니다.

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 배열의 개체 중 하나 이상이 Null 참조(Visual Basic의 경우 Nothing)인 경우

- 또는 -

waitHandles가 요소가 없는 배열이고 .NET Framework 버전이 2.0인 경우

DuplicateWaitObjectException

waitHandles 배열에 중복 요소가 포함되어 있는 경우

NotSupportedException

waitHandles에 포함된 개체의 수가 시스템에서 허용하는 것보다 많은 경우

- 또는 -

STAThreadAttribute 특성이 현재 스레드의 스레드 프로시저에 적용되고, waitHandles에 둘 이상의 요소가 포함된 경우

ApplicationException

waitHandles가 요소가 없는 배열이고 .NET Framework 버전이 1.0 또는 1.1인 경우

AbandonedMutexException

뮤텍스를 해제하지 않고 스레드가 종료되었기 때문에 대기 작업이 종료된 경우. Windows 98 또는 Windows Millennium Edition에서는 이 예외가 throw되지 않습니다.

AbandonedMutexException은 .NET Framework 버전 2.0에서 새로 소개되었습니다. 이전 버전에서는 뮤텍스가 중단되면 WaitAll 메서드가 true를 반환합니다. 뮤텍스가 중단되면 중대한 코딩 오류가 발생한 것입니다. 예외에는 유용한 디버깅 정보가 있습니다.

모든 핸들이 신호를 받으면 WaitAll 메서드가 값을 반환합니다. 일부 구현에서는 64개 이상의 핸들을 전달하면 NotSupportedException이 throw됩니다. 배열에 중복된 요소가 있으면 DuplicateWaitObjectException이 발생하여 호출에 실패합니다.

Note참고

STAThreadAttribute가 있는 스레드에서는 WaitAll 메서드가 지원되지 않습니다.

이 메서드 오버로드를 호출하는 것은 WaitAll(WaitHandle[],Int32,Boolean) 메서드 오버로드를 호출하고 millisecondsTimeoutexitContext에 각각 -1(Timeout.Infinite)과 true를 지정하는 것과 같습니다.

다음 코드 예제에서는 스레드 풀을 사용하여 여러 개의 파일을 비동기적으로 만들고 쓰는 방법을 보여 줍니다. 각 쓰기 작업은 작업 항목으로 대기하고 작업이 종료되면 신호를 받습니다. 주 스레드는 모든 항목이 신호를 받을 때까지 대기했다가 종료됩니다.

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 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

.NET Framework

2.0, 1.1, 1.0에서 지원
표시: