WaitHandle.WaitAll Metoda

Definice

Čeká na příjem signálu u všech prvků v zadaném poli.

Přetížení

Name Description
WaitAll(WaitHandle[], TimeSpan, Boolean)

Počká, až všechny prvky v zadaném poli obdrží signál, pomocí TimeSpan hodnoty určí časový interval a určí, zda se má před čekáním ukončit synchronizační doména.

WaitAll(WaitHandle[], Int32, Boolean)

Počká, až všechny prvky v zadaném poli obdrží signál, pomocí Int32 hodnoty určí časový interval a určí, zda se má před čekáním ukončit synchronizační doména.

WaitAll(WaitHandle[], TimeSpan)

Čeká, až všechny prvky v zadaném poli obdrží signál pomocí TimeSpan hodnoty k určení časového intervalu.

WaitAll(WaitHandle[], Int32)

Čeká, až všechny prvky v zadaném poli obdrží signál pomocí Int32 hodnoty k určení časového intervalu.

WaitAll(WaitHandle[])

Čeká na příjem signálu u všech prvků v zadaném poli.

WaitAll(WaitHandle[], TimeSpan, Boolean)

Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs

Počká, až všechny prvky v zadaném poli obdrží signál, pomocí TimeSpan hodnoty určí časový interval a určí, zda se má před čekáním ukončit synchronizační doména.

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

Parametry

waitHandles
WaitHandle[]

Pole WaitHandle obsahující objekty, pro které bude aktuální instance čekat. Toto pole nemůže obsahovat více odkazů na stejný objekt.

timeout
TimeSpan

Jedná TimeSpan se o počet milisekund, které se mají čekat, nebo počet TimeSpan milisekund, které představují -1 milisekundy, které se mají čekat neomezeně dlouho.

exitContext
Boolean

trueukončit synchronizační doménu pro kontext před čekáním (pokud je v synchronizovaném kontextu) a potom ji znovu požádat; v opačném případě . false

Návraty

true pokud každý prvek v waitHandles přijal signál; jinak false.

Výjimky

Parametr waitHandles je null.

nebo

Jeden nebo více objektů v waitHandles poli je null.

nebo

waitHandles je pole bez prvků a verze rozhraní .NET Framework je 2.0 nebo novější.

Pole waitHandles obsahuje prvky, které jsou duplicitní.

Počet objektů v waitHandles systému je větší než povolení systému.

nebo

Atribut STAThreadAttribute se použije na proceduru vlákna pro aktuální vlákno a waitHandles obsahuje více než jeden prvek.

waitHandles je pole bez prvků a verze rozhraní .NET Framework je 1.0 nebo 1.1.

timeout je záporné číslo jiné než -1 milisekund, což představuje nekonečný časový limit.

nebo

timeout je větší než Int32.MaxValue.

Čekání se ukončilo, protože vlákno se ukončilo bez uvolnění mutexu.

Pole waitHandles obsahuje transparentní proxy server pro jinou WaitHandle doménu aplikace.

Příklady

Následující příklad kódu ukazuje, jak pomocí fondu vláken asynchronně vytvořit a zapisovat do skupiny souborů. Každá operace zápisu je zařazena do fronty jako pracovní položka a signály po dokončení. Hlavní vlákno čeká na signál všech položek a pak se ukončí.

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

Poznámky

Pokud timeout je nula, metoda neblokuje. Testuje stav obslužných rutin čekání a vrátí okamžitě.

Pokud je mutex opuštěný, AbandonedMutexException je vyvolán. Opuštěný mutex často značí závažnou chybu kódování. V případě mutexu celého systému může značit, že aplikace byla náhle ukončena (například pomocí Správce úloh systému Windows). Výjimka obsahuje informace užitečné pro ladění.

Metoda WaitAll vrátí, když čekání skončí, což znamená, že všechny popisovače jsou signalovány nebo dojde k vypršení časového limitu. Pokud je předáno více než 64 popisovačů, NotSupportedException vyvolá se vyvolá. Pokud pole obsahuje duplicity, volání selže.

Note

Metoda není podporována WaitAll ve vláknech ve STA stavu.

Maximální hodnota pro timeout hodnotu je Int32.MaxValue.

Ukončení kontextu

Parametr exitContext nemá žádný vliv, pokud tato metoda není volána z nedefault spravovaného kontextu. Spravovaný kontext může být nedefaultní, pokud je vlákno uvnitř volání instance třídy odvozené z ContextBoundObject. I když aktuálně spouštíte metodu ve třídě, která není odvozená od ContextBoundObject, například String, můžete být v nedefaultním kontextu, pokud ContextBoundObject je ve vašem zásobníku v aktuální doméně aplikace.

Když se váš kód spouští v nedefaultním kontextu, určuje true , že vlákno exitContext ukončí nedefaultní spravovaný kontext (to znamená přechod na výchozí kontext) před spuštěním této metody. Vlákno se vrátí do původního nedefault kontextu po dokončení volání této metody.

Ukončení kontextu může být užitečné, pokud má třída vázané na SynchronizationAttribute kontext atribut. V takovém případě jsou všechna volání členů třídy automaticky synchronizována a synchronizační doména je celý text kódu pro třídu. Pokud kód v zásobníku volání člen volá tuto metodu a určuje true pro exitContext, vlákno ukončí synchronizační doménu, což umožňuje vlákno blokované při volání libovolného člena objektu pokračovat. Když tato metoda vrátí, vlákno, které provedlo volání, musí počkat na opětovné zadání synchronizační domény.

Platí pro

WaitAll(WaitHandle[], Int32, Boolean)

Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs

Počká, až všechny prvky v zadaném poli obdrží signál, pomocí Int32 hodnoty určí časový interval a určí, zda se má před čekáním ukončit synchronizační doména.

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

Parametry

waitHandles
WaitHandle[]

Pole WaitHandle obsahující objekty, pro které bude aktuální instance čekat. Toto pole nemůže obsahovat více odkazů na stejný objekt (duplikáty).

millisecondsTimeout
Int32

Počet milisekund, které se mají počkat, nebo Infinite (-1) čekat na neomezenou dobu.

exitContext
Boolean

trueukončit synchronizační doménu pro kontext před čekáním (pokud je v synchronizovaném kontextu) a potom ji znovu požádat; v opačném případě . false

Návraty

true pokud každý prvek v waitHandles obdržel signál; jinak , false.

Výjimky

Parametr waitHandles je null.

nebo

Jeden nebo více objektů v waitHandles poli je null.

nebo

waitHandles je pole bez prvků a verze rozhraní .NET Framework je 2.0 nebo novější.

Pole waitHandles obsahuje prvky, které jsou duplicitní.

Počet objektů v waitHandles systému je větší než povolení systému.

nebo

Aktuální vlákno je ve STA stavu a waitHandles obsahuje více než jeden prvek.

waitHandles je pole bez prvků a verze rozhraní .NET Framework je 1.0 nebo 1.1.

millisecondsTimeout je záporné číslo jiné než -1, což představuje nekonečný časový limit.

Čekání bylo dokončeno, protože vlákno se ukončilo bez uvolnění mutexu.

Pole waitHandles obsahuje transparentní proxy server pro jinou WaitHandle doménu aplikace.

Příklady

Následující příklad kódu ukazuje, jak pomocí fondu vláken asynchronně vytvořit a zapisovat do skupiny souborů. Každá operace zápisu je zařazena do fronty jako pracovní položka a signály po dokončení. Hlavní vlákno čeká na signál všech položek a pak se ukončí.

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

Poznámky

Pokud millisecondsTimeout je nula, metoda neblokuje. Testuje stav obslužných rutin čekání a vrátí okamžitě.

Pokud je mutex opuštěný, AbandonedMutexException je vyvolán. Opuštěný mutex často značí závažnou chybu kódování. V případě mutexu celého systému může značit, že aplikace byla náhle ukončena (například pomocí Správce úloh systému Windows). Výjimka obsahuje informace užitečné pro ladění.

Metoda WaitAll vrátí, když čekání skončí, což znamená, že jsou všechny popisovače signalovány nebo když dojde k vypršení časového limitu. Pokud je předáno více než 64 popisovačů, NotSupportedException vyvolá se vyvolá. Pokud pole obsahuje duplicity, volání selže s chybou DuplicateWaitObjectException.

Note

Metoda není podporována WaitAll ve vláknech ve STA stavu.

Ukončení kontextu

Parametr exitContext nemá žádný vliv, pokud tato metoda není volána z nedefault spravovaného kontextu. Spravovaný kontext může být nedefaultní, pokud je vlákno uvnitř volání instance třídy odvozené z ContextBoundObject. I když aktuálně spouštíte metodu ve třídě, která není odvozená od ContextBoundObject, například String, můžete být v nedefaultním kontextu, pokud ContextBoundObject je ve vašem zásobníku v aktuální doméně aplikace.

Když se váš kód spouští v nedefaultním kontextu, určuje true , že vlákno exitContext ukončí nedefaultní spravovaný kontext (to znamená přechod na výchozí kontext) před spuštěním této metody. Vlákno se vrátí do původního nedefault kontextu po dokončení volání této metody.

Ukončení kontextu může být užitečné, pokud má třída vázané na SynchronizationAttribute kontext atribut. V takovém případě jsou všechna volání členů třídy automaticky synchronizována a synchronizační doména je celý text kódu pro třídu. Pokud kód v zásobníku volání člen volá tuto metodu a určuje true pro exitContext, vlákno ukončí synchronizační doménu, což umožňuje vlákno blokované při volání libovolného člena objektu pokračovat. Když tato metoda vrátí, vlákno, které provedlo volání, musí počkat na opětovné zadání synchronizační domény.

Platí pro

WaitAll(WaitHandle[], TimeSpan)

Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs

Čeká, až všechny prvky v zadaném poli obdrží signál pomocí TimeSpan hodnoty k určení časového intervalu.

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

Parametry

waitHandles
WaitHandle[]

Pole WaitHandle obsahující objekty, pro které bude aktuální instance čekat. Toto pole nemůže obsahovat více odkazů na stejný objekt.

timeout
TimeSpan

Jedná TimeSpan se o počet milisekund, které se mají čekat, nebo počet TimeSpan milisekund, které představují -1 milisekundy, které se mají čekat neomezeně dlouho.

Návraty

true pokud každý prvek v waitHandles obdržel signál; jinak , false.

Výjimky

Parametr waitHandles je null.

nebo

Jeden nebo více objektů v waitHandles poli je null.

nebo

waitHandles je pole bez prvků.

Pole waitHandles obsahuje prvky, které jsou duplicitní.

Počet objektů v waitHandles systému je větší než povolení systému.

nebo

Aktuální vlákno je ve STA stavu a waitHandles obsahuje více než jeden prvek.

timeout je záporné číslo jiné než -1 milisekund, což představuje nekonečný časový limit.

nebo

timeout je větší než Int32.MaxValue.

Čekání se ukončilo, protože vlákno se ukončilo bez uvolnění mutexu.

Pole waitHandles obsahuje transparentní proxy server pro jinou WaitHandle doménu aplikace.

Poznámky

Pokud timeout je nula, metoda neblokuje. Testuje stav obslužných rutin čekání a vrátí okamžitě.

Metoda WaitAll vrátí, když čekání skončí, což znamená, že všechny popisovače jsou signalovány nebo dojde k vypršení časového limitu. Pokud je předáno více než 64 popisovačů, NotSupportedException vyvolá se vyvolá. Pokud pole obsahuje duplicity, volání selže.

Note

Metoda není podporována WaitAll ve vláknech ve STA stavu.

Maximální hodnota pro timeout hodnotu je Int32.MaxValue.

Volání této přetížení metody je stejné jako volání WaitAll(WaitHandle[], TimeSpan, Boolean) přetížení a určení false pro exitContext.

Platí pro

WaitAll(WaitHandle[], Int32)

Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs

Čeká, až všechny prvky v zadaném poli obdrží signál pomocí Int32 hodnoty k určení časového intervalu.

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

Parametry

waitHandles
WaitHandle[]

Pole WaitHandle obsahující objekty, pro které bude aktuální instance čekat. Toto pole nemůže obsahovat více odkazů na stejný objekt (duplikáty).

millisecondsTimeout
Int32

Počet milisekund, které se mají počkat, nebo Infinite (-1) čekat na neomezenou dobu.

Návraty

true pokud každý prvek v waitHandles obdržel signál; jinak , false.

Výjimky

Parametr waitHandles je null.

nebo

Jeden nebo více objektů v waitHandles poli je null.

nebo

waitHandles je pole bez prvků.

Pole waitHandles obsahuje prvky, které jsou duplicitní.

Počet objektů v waitHandles systému je větší než povolení systému.

nebo

Aktuální vlákno je ve STA stavu a waitHandles obsahuje více než jeden prvek.

millisecondsTimeout je záporné číslo jiné než -1, což představuje nekonečný časový limit.

Čekání bylo dokončeno, protože vlákno se ukončilo bez uvolnění mutexu.

Pole waitHandles obsahuje transparentní proxy server pro jinou WaitHandle doménu aplikace.

Poznámky

Pokud millisecondsTimeout je nula, metoda neblokuje. Testuje stav obslužných rutin čekání a vrátí okamžitě.

Metoda WaitAll vrátí, když čekání skončí, což znamená, že jsou všechny popisovače signalovány nebo když dojde k vypršení časového limitu. Pokud je předáno více než 64 popisovačů, NotSupportedException vyvolá se vyvolá. Pokud pole obsahuje duplicity, volání selže s chybou DuplicateWaitObjectException.

Note

Metoda není podporována WaitAll ve vláknech ve STA stavu.

Volání této přetížení metody je stejné jako volání WaitAll(WaitHandle[], Int32, Boolean) přetížení a určení false pro exitContext.

Platí pro

WaitAll(WaitHandle[])

Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs
Zdroj:
WaitHandle.cs

Čeká na příjem signálu u všech prvků v zadaném poli.

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

Parametry

waitHandles
WaitHandle[]

Pole WaitHandle obsahující objekty, pro které bude aktuální instance čekat. Toto pole nemůže obsahovat více odkazů na stejný objekt.

Návraty

true pokud každý prvek v waitHandles obdržel signál; jinak metoda nikdy nevrátí.

Výjimky

Parametr waitHandles je null. nebo

Jeden nebo více objektů v waitHandles poli jsou null.

nebo

waitHandles je pole bez prvků a verze rozhraní .NET Framework je 2.0 nebo novější.

Pole waitHandles obsahuje prvky, které jsou duplicitní.

Počet objektů v waitHandles systému je větší než povolení systému.

nebo

Aktuální vlákno je ve STA stavu a waitHandles obsahuje více než jeden prvek.

waitHandles je pole bez prvků a verze rozhraní .NET Framework je 1.0 nebo 1.1.

Čekání se ukončilo, protože vlákno se ukončilo bez uvolnění mutexu.

Pole waitHandles obsahuje transparentní proxy server pro jinou WaitHandle doménu aplikace.

Příklady

Následující příklad kódu ukazuje, jak pomocí fondu vláken asynchronně vytvořit a zapisovat do skupiny souborů. Každá operace zápisu je zařazena do fronty jako pracovní položka a signály po dokončení. Hlavní vlákno čeká na signál všech položek a pak se ukončí.

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

Poznámky

AbandonedMutexException je novinka v rozhraní .NET Framework verze 2.0. V předchozích verzích WaitAll vrátí true metoda při opuštění mutexu. Opuštěný mutex často značí závažnou chybu kódování. V případě mutexu celého systému může značit, že aplikace byla náhle ukončena (například pomocí Správce úloh systému Windows). Výjimka obsahuje informace užitečné pro ladění.

Metoda WaitAll se vrátí, když jsou všechny popisovače signalovány. Pokud je předáno více než 64 popisovačů, NotSupportedException vyvolá se vyvolá. Pokud pole obsahuje duplicity, volání selže s chybou DuplicateWaitObjectException.

Note

Metoda není podporována WaitAll ve vláknech ve STA stavu.

Volání této přetížení metody je ekvivalentní volání WaitAll(WaitHandle[], Int32, Boolean) přetížení metody a určení -1 (nebo Timeout.Infinite) pro millisecondsTimeout a true pro exitContext.

Platí pro