按一下以給予評分及指教
MSDN
MSDN Library
.NET 開發
.NET Framework
WaitAll 方法
 WaitAll 方法 (WaitHandle[])

  開啟低頻寬檢視
本頁僅適用於
Microsoft Visual Studio 2008/.NET Framework 3.5

其他版本也適用於下列軟體:
.NET Framework 類別庫
WaitHandle..::.WaitAll 方法 (array<WaitHandle>[]()[])

更新:2007 年 11 月

等候指定陣列中的所有元素都收到信號。

命名空間:  System.Threading
組件:  mscorlib (在 mscorlib.dll 中)

Visual Basic (宣告)
Public Shared Function WaitAll ( _
    waitHandles As WaitHandle() _
) As Boolean
Visual Basic (使用方式)
Dim waitHandles As WaitHandle()
Dim returnValue As Boolean

returnValue = WaitHandle.WaitAll(waitHandles)
C#
public static bool WaitAll(
    WaitHandle[] waitHandles
)
Visual C++
public:
static bool WaitAll(
    array<WaitHandle^>^ waitHandles
)
J#
public static boolean WaitAll(
    WaitHandle[] waitHandles
)
JScript
public static function WaitAll(
    waitHandles : WaitHandle[]
) : boolean

參數

waitHandles
型別:array<System.Threading..::.WaitHandle>[]()[]

WaitHandle 陣列,包含目前執行個體將等候的物件。這個陣列不能包含相同物件的多個參考。

傳回值

型別:System..::.Boolean

waitHandles 中的所有元素都已收到訊號時,為 true,否則,即為該方法就絕不會復原。

例外狀況條件
ArgumentNullException

waitHandles 參數為 nullNothingnullptrNull 參照 (即 Visual Basic 中的 Nothing)。-或-

waitHandles 陣列中的一個或多個物件為 nullNothingnullptrNull 參照 (即 Visual Basic 中的 Nothing)

-或-

waitHandles 是不包含任何元素的陣列,而且 .NET Framework 版本為 2.0。

DuplicateWaitObjectException

waitHandles 陣列包含是複本的元素。

NotSupportedException

waitHandles 中物件的數目大於系統容許的數量。

-或-

STAThreadAttribute 屬性會套用到目前執行緒的執行緒程序中,且 waitHandles 會包含一個以上的元素。

ApplicationException

waitHandles 是不包含任何元素的陣列,且 .NET Framework 版本為 1.0 或 1.1。

AbandonedMutexException

由於執行緒結束時未釋放 Mutex,而導致等候結束。在 Windows 98 或 Windows Millennium Edition 上不會擲回這個例外狀況。

InvalidOperationException

waitHandles 陣列會在另一個應用程式定義域中包含 WaitHandle 的 Transparent Proxy。

AbandonedMutexException 是 .NET Framework 2.0 版的新功能。在先前版本中,放棄 Mutex 時,WaitAll 方法會傳回 true。已放棄的 Mutex 通常會指出嚴重的程式碼錯誤。在系統範圍 Mutex 的情況中,它可能會指出應用程式已意外結束 (例如,使用 [Windows 工作管理員])。例外狀況包含偵錯的有用資訊。

當所有的控制代碼都收到信號後,會傳回 WaitAll 方法。有些實作 (Implementation) 的情況是,如果傳遞超過 64 個控制代碼,會擲回 NotSupportedException。如果陣列中包含重複的元素,則呼叫會失敗,且傳回 DuplicateWaitObjectException

注意事項:

擁有 STAThreadAttribute 的執行緒上不支援 WaitAll 方法。

呼叫這個方法多載相當於呼叫 WaitAll(array<WaitHandle>[]()[], Int32, Boolean) 方法多載以及為 millisecondsTimeout 指定 -1 (或 Timeout..::.Infinite),且為 exitContext 指定 true

下列程式碼範例會示範了如何使用執行緒集區,以非同步方式來建立和寫入一組檔案。每一個寫入作業會佇列成一個工作項目,並於完成時發出信號。主要的執行緒會等到所有項目都發出完成訊號之後才會結束。

Visual Basic
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.
        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

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

Visual C++
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.
// Maintain state to pass to WriteToFile.

[assembly:FileIOPermissionAttribute(SecurityAction::RequestMinimum,
All="C:\\TestTest")];
ref class State
{
public:
   String^ fileName;
   array<Byte>^byteArray;
   ManualResetEvent^ manualEvent;
   State( String^ fileName, array<Byte>^byteArray, ManualResetEvent^ manualEvent )
      : fileName( fileName ), byteArray( byteArray ), manualEvent( manualEvent )
   {}

};

ref class Writer
{
private:
   static int workItemCount = 0;
   Writer(){}


public:
   static void WriteToFile( Object^ state )
   {
      int workItemNumber = workItemCount;
      Interlocked::Increment( workItemCount );
      Console::WriteLine( "Starting work item {0}.", workItemNumber.ToString() );
      State^ stateInfo = dynamic_cast<State^>(state);
      FileStream^ fileWriter;

      // Create and write to the file.
      try
      {
         fileWriter = gcnew FileStream( stateInfo->fileName,FileMode::Create );
         fileWriter->Write( stateInfo->byteArray, 0, stateInfo->byteArray->Length );
      }
      finally
      {
         if ( fileWriter != nullptr )
         {
            fileWriter->Close();
         }

         // Signal main() that the work item has finished.
         Console::WriteLine( "Ending work item {0}.", workItemNumber.ToString() );
         stateInfo->manualEvent->Set();
      }

   }

};

void main()
{
   const int numberOfFiles = 5;
   String^ dirName =  "C:\\TestTest";
   String^ fileName;
   array<Byte>^byteArray;
   Random^ randomGenerator = gcnew Random;
   array<ManualResetEvent^>^manualEvents = gcnew array<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 = gcnew array<Byte>(1000000);
      randomGenerator->NextBytes( byteArray );
      manualEvents[ i ] = gcnew ManualResetEvent( false );
      stateInfo = gcnew State( fileName,byteArray,manualEvents[ i ] );
      ThreadPool::QueueUserWorkItem( gcnew 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." );
}


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

.NET Framework 和 .NET Compact Framework 並不支援各種平台的所有版本。如需支援平台版本的相關資訊,請參閱 .NET Framework 系統需求

.NET Framework

支援版本:3.5、3.0、2.0、1.1、1.0
社群內容   什麼是社群內容?
新增內容 RSS  註解
Processing
© 2009 Microsoft Corporation. 著作權所有,並保留一切權利。 使用規定  |  商標  |  隱私權聲明
Page view tracker