WaitHandle.WaitAll Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Č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.
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.
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.
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.
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.
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.