Partilhar via


WaitHandle.WaitAll Método

Definição

Aguarda que todos os elementos na matriz especificada recebam um sinal.

Sobrecargas

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

Aguarda que todos os elementos na matriz especificada recebam um sinal, usando um TimeSpan valor para especificar o intervalo de tempo e especificando se o domínio de sincronização deve ser encerrado antes da espera.

WaitAll(WaitHandle[], Int32, Boolean)

Aguarda que todos os elementos na matriz especificada recebam um sinal, usando um Int32 valor para especificar o intervalo de tempo e especificando se o domínio de sincronização deve ser encerrado antes da espera.

WaitAll(WaitHandle[], TimeSpan)

Aguarda que todos os elementos na matriz especificada recebam um sinal, usando um TimeSpan valor para especificar o intervalo de tempo.

WaitAll(WaitHandle[], Int32)

Aguarda que todos os elementos na matriz especificada recebam um sinal, usando um Int32 valor para especificar o intervalo de tempo.

WaitAll(WaitHandle[])

Aguarda que todos os elementos na matriz especificada recebam um sinal.

WaitAll(WaitHandle[], TimeSpan, Boolean)

Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs

Aguarda que todos os elementos na matriz especificada recebam um sinal, usando um TimeSpan valor para especificar o intervalo de tempo e especificando se o domínio de sincronização deve ser encerrado antes da espera.

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

Parâmetros

waitHandles
WaitHandle[]

Uma WaitHandle matriz que contém os objetos para os quais a instância atual aguardará. Essa matriz não pode conter várias referências ao mesmo objeto.

timeout
TimeSpan

Um TimeSpan que representa o número de milissegundos a aguardar, ou um TimeSpan que representa -1 milissegundos, para aguardar indefinidamente.

exitContext
Boolean

true para sair do domínio de sincronização para o contexto antes da espera (se em um contexto sincronizado) e requisioná-lo posteriormente; caso contrário, false.

Retornos

true quando cada elemento recebeu waitHandles um sinal; caso contrário false.

Exceções

O waitHandles parâmetro é null.

- ou -

Um ou mais dos objetos na waitHandles matriz é null.

- ou -

waitHandles é uma matriz sem elementos e a versão do .NET Framework é 2.0 ou posterior.

A waitHandles matriz contém elementos duplicados.

O número de objetos é waitHandles maior do que o que o sistema permite.

- ou -

O STAThreadAttribute atributo é aplicado ao procedimento de thread do thread atual e waitHandles contém mais de um elemento.

waitHandles é uma matriz sem elementos e a versão do .NET Framework é 1.0 ou 1.1.

timeout é um número negativo diferente de -1 milissegundos, que representa um tempo limite infinito.

- ou -

timeout é maior que Int32.MaxValue.

A espera foi encerrada porque um thread foi encerrado sem liberar um mutex.

A waitHandles matriz contém um proxy transparente para um WaitHandle em outro domínio de aplicativo.

Exemplos

O exemplo de código a seguir mostra como usar o pool de threads para criar e gravar de forma assíncrona em um grupo de arquivos. Cada operação de gravação é enfileirada como um item de trabalho e sinaliza quando é concluída. O thread principal aguarda que todos os itens sinalizem e, em seguida, saiam.

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

Comentários

Se timeout for zero, o método não bloqueará. Ele testa o estado dos identificadores de espera e retorna imediatamente.

Se um mutex for abandonado, um AbandonedMutexException será lançado. Um mutex abandonado geralmente indica um erro de codificação grave. No caso de um mutex em todo o sistema, pode indicar que um aplicativo foi encerrado abruptamente (por exemplo, usando o Gerenciador de Tarefas do Windows). A exceção contém informações úteis para depuração.

O WaitAll método retorna quando a espera é encerrada, o que significa que todos os identificadores são sinalizados ou ocorre um tempo limite. Se mais de 64 identificadores forem passados, um NotSupportedException será gerado. Se a matriz contiver duplicatas, a chamada falhará.

Note

Não WaitAll há suporte para o método em threads no STA estado.

O valor máximo é timeoutInt32.MaxValue.

Saindo do contexto

O exitContext parâmetro não tem efeito, a menos que esse método seja chamado de dentro de um contexto gerenciado não padrão. O contexto gerenciado poderá ser não padrão se o thread estiver dentro de uma chamada para uma instância de uma classe derivada de ContextBoundObject. Mesmo que você esteja executando um método em uma classe que não seja derivada de ContextBoundObject, por exemplo String, você poderá estar em um contexto não padrão se estiver ContextBoundObject em sua pilha no domínio do aplicativo atual.

Quando o código está sendo executado em um contexto não padrão, especificar true para exitContext fazer com que o thread saia do contexto gerenciado não padrão (ou seja, fazer a transição para o contexto padrão) antes de executar esse método. O thread retorna ao contexto não padrão original após a conclusão da chamada para esse método.

Sair do contexto pode ser útil quando a classe associada ao contexto tem o SynchronizationAttribute atributo. Nesse caso, todas as chamadas para membros da classe são sincronizadas automaticamente e o domínio de sincronização é todo o corpo do código da classe. Se o código na pilha de chamadas de um membro chamar esse método e especificar trueexitContext, o thread sairá do domínio de sincronização, o que permite que um thread bloqueado em uma chamada para qualquer membro do objeto prossiga. Quando esse método retorna, o thread que fez a chamada deve aguardar para recuar novamente no domínio de sincronização.

Aplica-se a

WaitAll(WaitHandle[], Int32, Boolean)

Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs

Aguarda que todos os elementos na matriz especificada recebam um sinal, usando um Int32 valor para especificar o intervalo de tempo e especificando se o domínio de sincronização deve ser encerrado antes da espera.

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

Parâmetros

waitHandles
WaitHandle[]

Uma WaitHandle matriz que contém os objetos para os quais a instância atual aguardará. Essa matriz não pode conter várias referências ao mesmo objeto (duplicatas).

millisecondsTimeout
Int32

O número de milissegundos a aguardar ou Infinite (-1) aguardar indefinidamente.

exitContext
Boolean

true para sair do domínio de sincronização para o contexto antes da espera (se em um contexto sincronizado) e requisioná-lo posteriormente; caso contrário, false.

Retornos

true quando cada elemento recebeu waitHandles um sinal; caso contrário, false.

Exceções

O waitHandles parâmetro é null.

- ou -

Um ou mais dos objetos na waitHandles matriz é null.

- ou -

waitHandles é uma matriz sem elementos e a versão do .NET Framework é 2.0 ou posterior.

A waitHandles matriz contém elementos duplicados.

O número de objetos é waitHandles maior do que o que o sistema permite.

- ou -

O thread atual está no STA estado e waitHandles contém mais de um elemento.

waitHandles é uma matriz sem elementos e a versão do .NET Framework é 1.0 ou 1.1.

millisecondsTimeout é um número negativo diferente de -1, que representa um tempo limite infinito.

A espera foi concluída porque um thread foi encerrado sem liberar um mutex.

A waitHandles matriz contém um proxy transparente para um WaitHandle em outro domínio de aplicativo.

Exemplos

O exemplo de código a seguir mostra como usar o pool de threads para criar e gravar de forma assíncrona em um grupo de arquivos. Cada operação de gravação é enfileirada como um item de trabalho e sinaliza quando é concluída. O thread principal aguarda que todos os itens sinalizem e, em seguida, saiam.

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

Comentários

Se millisecondsTimeout for zero, o método não bloqueará. Ele testa o estado dos identificadores de espera e retorna imediatamente.

Se um mutex for abandonado, um AbandonedMutexException será lançado. Um mutex abandonado geralmente indica um erro de codificação grave. No caso de um mutex em todo o sistema, pode indicar que um aplicativo foi encerrado abruptamente (por exemplo, usando o Gerenciador de Tarefas do Windows). A exceção contém informações úteis para depuração.

O WaitAll método retorna quando a espera é encerrada, o que significa quando todos os identificadores são sinalizados ou quando ocorre o tempo limite. Se mais de 64 identificadores forem passados, um NotSupportedException será gerado. Se houver duplicatas na matriz, a chamada falhará com um DuplicateWaitObjectException.

Note

Não WaitAll há suporte para o método em threads no STA estado.

Saindo do contexto

O exitContext parâmetro não tem efeito, a menos que esse método seja chamado de dentro de um contexto gerenciado não padrão. O contexto gerenciado poderá ser não padrão se o thread estiver dentro de uma chamada para uma instância de uma classe derivada de ContextBoundObject. Mesmo que você esteja executando um método em uma classe que não seja derivada de ContextBoundObject, por exemplo String, você poderá estar em um contexto não padrão se estiver ContextBoundObject em sua pilha no domínio do aplicativo atual.

Quando o código está sendo executado em um contexto não padrão, especificar true para exitContext fazer com que o thread saia do contexto gerenciado não padrão (ou seja, fazer a transição para o contexto padrão) antes de executar esse método. O thread retorna ao contexto não padrão original após a conclusão da chamada para esse método.

Sair do contexto pode ser útil quando a classe associada ao contexto tem o SynchronizationAttribute atributo. Nesse caso, todas as chamadas para membros da classe são sincronizadas automaticamente e o domínio de sincronização é todo o corpo do código da classe. Se o código na pilha de chamadas de um membro chamar esse método e especificar trueexitContext, o thread sairá do domínio de sincronização, o que permite que um thread bloqueado em uma chamada para qualquer membro do objeto prossiga. Quando esse método retorna, o thread que fez a chamada deve aguardar para recuar novamente no domínio de sincronização.

Aplica-se a

WaitAll(WaitHandle[], TimeSpan)

Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs

Aguarda que todos os elementos na matriz especificada recebam um sinal, usando um TimeSpan valor para especificar o intervalo de tempo.

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

Parâmetros

waitHandles
WaitHandle[]

Uma WaitHandle matriz que contém os objetos para os quais a instância atual aguardará. Essa matriz não pode conter várias referências ao mesmo objeto.

timeout
TimeSpan

Um TimeSpan que representa o número de milissegundos a aguardar, ou um TimeSpan que representa -1 milissegundos, para aguardar indefinidamente.

Retornos

true quando cada elemento recebeu waitHandles um sinal; caso contrário, false.

Exceções

O waitHandles parâmetro é null.

- ou -

Um ou mais dos objetos na waitHandles matriz é null.

- ou -

waitHandles é uma matriz sem elementos.

A waitHandles matriz contém elementos duplicados.

O número de objetos é waitHandles maior do que o que o sistema permite.

- ou -

O thread atual está no STA estado e waitHandles contém mais de um elemento.

timeout é um número negativo diferente de -1 milissegundos, que representa um tempo limite infinito.

- ou -

timeout é maior que Int32.MaxValue.

A espera foi encerrada porque um thread foi encerrado sem liberar um mutex.

A waitHandles matriz contém um proxy transparente para um WaitHandle em outro domínio de aplicativo.

Comentários

Se timeout for zero, o método não bloqueará. Ele testa o estado dos identificadores de espera e retorna imediatamente.

O WaitAll método retorna quando a espera é encerrada, o que significa que todos os identificadores são sinalizados ou ocorre um tempo limite. Se mais de 64 identificadores forem passados, um NotSupportedException será gerado. Se a matriz contiver duplicatas, a chamada falhará.

Note

Não WaitAll há suporte para o método em threads no STA estado.

O valor máximo é timeoutInt32.MaxValue.

Chamar essa sobrecarga de método é o mesmo que chamar a WaitAll(WaitHandle[], TimeSpan, Boolean) sobrecarga e especificar false para exitContext.

Aplica-se a

WaitAll(WaitHandle[], Int32)

Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs

Aguarda que todos os elementos na matriz especificada recebam um sinal, usando um Int32 valor para especificar o intervalo de tempo.

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

Parâmetros

waitHandles
WaitHandle[]

Uma WaitHandle matriz que contém os objetos para os quais a instância atual aguardará. Essa matriz não pode conter várias referências ao mesmo objeto (duplicatas).

millisecondsTimeout
Int32

O número de milissegundos a aguardar ou Infinite (-1) aguardar indefinidamente.

Retornos

true quando cada elemento recebeu waitHandles um sinal; caso contrário, false.

Exceções

O waitHandles parâmetro é null.

- ou -

Um ou mais dos objetos na waitHandles matriz é null.

- ou -

waitHandles é uma matriz sem elementos.

A waitHandles matriz contém elementos duplicados.

O número de objetos é waitHandles maior do que o que o sistema permite.

- ou -

O thread atual está no STA estado e waitHandles contém mais de um elemento.

millisecondsTimeout é um número negativo diferente de -1, que representa um tempo limite infinito.

A espera foi concluída porque um thread foi encerrado sem liberar um mutex.

A waitHandles matriz contém um proxy transparente para um WaitHandle em outro domínio de aplicativo.

Comentários

Se millisecondsTimeout for zero, o método não bloqueará. Ele testa o estado dos identificadores de espera e retorna imediatamente.

O WaitAll método retorna quando a espera é encerrada, o que significa quando todos os identificadores são sinalizados ou quando ocorre o tempo limite. Se mais de 64 identificadores forem passados, um NotSupportedException será gerado. Se houver duplicatas na matriz, a chamada falhará com um DuplicateWaitObjectException.

Note

Não WaitAll há suporte para o método em threads no STA estado.

Chamar essa sobrecarga de método é o mesmo que chamar a WaitAll(WaitHandle[], Int32, Boolean) sobrecarga e especificar false para exitContext.

Aplica-se a

WaitAll(WaitHandle[])

Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs
Origem:
WaitHandle.cs

Aguarda que todos os elementos na matriz especificada recebam um sinal.

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

Parâmetros

waitHandles
WaitHandle[]

Uma WaitHandle matriz que contém os objetos para os quais a instância atual aguardará. Essa matriz não pode conter várias referências ao mesmo objeto.

Retornos

true quando cada elemento em waitHandles recebeu um sinal; caso contrário, o método nunca retorna.

Exceções

O waitHandles parâmetro é null. - ou -

Um ou mais dos objetos na waitHandles matriz são null.

- ou -

waitHandles é uma matriz sem elementos e a versão do .NET Framework é 2.0 ou posterior.

A waitHandles matriz contém elementos duplicados.

O número de objetos é waitHandles maior do que o que o sistema permite.

- ou -

O thread atual está no STA estado e waitHandles contém mais de um elemento.

waitHandles é uma matriz sem elementos e a versão do .NET Framework é 1.0 ou 1.1.

A espera foi encerrada porque um thread foi encerrado sem liberar um mutex.

A waitHandles matriz contém um proxy transparente para um WaitHandle em outro domínio de aplicativo.

Exemplos

O exemplo de código a seguir mostra como usar o pool de threads para criar e gravar de forma assíncrona em um grupo de arquivos. Cada operação de gravação é enfileirada como um item de trabalho e sinaliza quando é concluída. O thread principal aguarda que todos os itens sinalizem e, em seguida, saiam.

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

Comentários

AbandonedMutexException é novo no .NET Framework versão 2.0. Nas versões anteriores, o WaitAll método retorna true quando um mutex é abandonado. Um mutex abandonado geralmente indica um erro de codificação grave. No caso de um mutex em todo o sistema, pode indicar que um aplicativo foi encerrado abruptamente (por exemplo, usando o Gerenciador de Tarefas do Windows). A exceção contém informações úteis para depuração.

O WaitAll método retorna quando todos os identificadores são sinalizados. Se mais de 64 identificadores forem passados, um NotSupportedException será gerado. Se a matriz contiver duplicatas, a chamada falhará com um DuplicateWaitObjectException.

Note

Não WaitAll há suporte para o método em threads no STA estado.

Chamar essa sobrecarga de método é equivalente a chamar a sobrecarga do WaitAll(WaitHandle[], Int32, Boolean) método e especificar -1 (ou Timeout.Infinite) para millisecondsTimeout e true para exitContext.

Aplica-se a