WaitHandle.WaitAll Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen.
Überlädt
| Name | Beschreibung |
|---|---|
| WaitAll(WaitHandle[], TimeSpan, Boolean) |
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein TimeSpan Wert verwendet wird, um das Zeitintervall anzugeben, und gibt an, ob die Synchronisierungsdomäne vor der Wartezeit beendet werden soll. |
| WaitAll(WaitHandle[], Int32, Boolean) |
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein Int32 Wert verwendet wird, um das Zeitintervall anzugeben und anzugeben, ob die Synchronisierungsdomäne vor der Wartezeit beendet werden soll. |
| WaitAll(WaitHandle[], TimeSpan) |
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein TimeSpan Wert verwendet wird, um das Zeitintervall anzugeben. |
| WaitAll(WaitHandle[], Int32) |
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein Int32 Wert verwendet wird, um das Zeitintervall anzugeben. |
| WaitAll(WaitHandle[]) |
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen. |
WaitAll(WaitHandle[], TimeSpan, Boolean)
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein TimeSpan Wert verwendet wird, um das Zeitintervall anzugeben, und gibt an, ob die Synchronisierungsdomäne vor der Wartezeit beendet werden soll.
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
Parameter
- waitHandles
- WaitHandle[]
Ein WaitHandle Array, das die Objekte enthält, für die die aktuelle Instanz wartet. Dieses Array darf nicht mehrere Verweise auf dasselbe Objekt enthalten.
- timeout
- TimeSpan
Ein TimeSpan Wert, der die Anzahl der zu wartenden Millisekunden darstellt, oder eine TimeSpan , die -1 Millisekunden darstellt, um unbegrenzt zu warten.
- exitContext
- Boolean
trueum die Synchronisierungsdomäne für den Kontext vor der Wartezeit zu beenden (falls in einem synchronisierten Kontext), und bitten Sie sie danach erneut; andernfalls . false
Gibt zurück
true wenn jedes Element in waitHandles ein Signal empfangen hat; andernfalls false.
Ausnahmen
Der waitHandles Parameter ist null.
- oder -
Mindestens eines der Objekte im waitHandles Array ist null.
- oder -
waitHandles ist ein Array ohne Elemente, und die .NET Framework-Version ist 2.0 oder höher.
Das waitHandles Array enthält Elemente, die Duplikate sind.
Die Anzahl der Objekte waitHandles ist größer als das System zulässig ist.
- oder -
Das STAThreadAttribute Attribut wird auf die Threadprozedur für den aktuellen Thread angewendet und waitHandles enthält mehrere Elemente.
waitHandles ist ein Array ohne Elemente, und die .NET Framework-Version ist 1.0 oder 1.1.
timeout ist eine andere negative Zahl als -1 Millisekunden, die ein unendliches Timeout darstellt.
- oder -
timeout ist größer als Int32.MaxValue.
Die Wartezeit wurde beendet, da ein Thread beendet wurde, ohne einen Mutex freizugeben.
Das waitHandles Array enthält einen transparenten Proxy für eine in einer WaitHandle anderen Anwendungsdomäne.
Beispiele
Das folgende Codebeispiel zeigt, wie Sie den Threadpool zum asynchronen Erstellen und Schreiben in eine Gruppe von Dateien verwenden. Jeder Schreibvorgang wird als Arbeitsaufgabe in die Warteschlange gestellt und signalisiert, wann er abgeschlossen ist. Der Hauptthread wartet, bis alle Elemente signalisiert und dann beendet werden.
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
Hinweise
Wenn timeout null ist, wird die Methode nicht blockiert. Er testet den Zustand der Wartepunkte und gibt sofort zurück.
Wenn ein Mutex abgebrochen wird, wird ein AbandonedMutexException Geworfen. Ein verlassener Mutex weist häufig auf einen schwerwiegenden Codierungsfehler hin. Bei einem systemweiten Mutex kann es darauf hindeuten, dass eine Anwendung abrupt beendet wurde (z. B. mithilfe des Windows-Task-Managers). Die Ausnahme enthält Informationen, die für das Debuggen hilfreich sind.
Die WaitAll Methode gibt zurück, wenn die Wartezeit beendet wird, was bedeutet, dass entweder alle Ziehpunkte signalisiert oder ein Timeout auftritt. Wenn mehr als 64 Ziehpunkte übergeben werden, wird ein NotSupportedException Fehler ausgelöst. Wenn das Array Duplikate enthält, schlägt der Aufruf fehl.
Der maximal zulässige Wert timeout ist Int32.MaxValue.
Beenden des Kontexts
Der exitContext Parameter hat keine Auswirkung, es sei denn, diese Methode wird aus einem nicht standardmäßigen verwalteten Kontext aufgerufen. Der verwaltete Kontext kann nicht standardmäßig sein, wenn sich Ihr Thread in einem Aufruf einer Instanz einer von einer Klasse abgeleiteten Klasse befindet ContextBoundObject. Auch wenn Sie derzeit eine Methode für eine Klasse ausführen, die nicht von ContextBoundObject, z String. B. abgeleitet ist, können Sie sich in einem nicht standardmäßigen Kontext befinden, wenn sich ein ContextBoundObject Stapel in der aktuellen Anwendungsdomäne befindet.
Wenn Der Code in einem nicht standardmäßigen Kontext ausgeführt wird, geben Sie true an exitContext , dass der Thread den nicht standardmäßigen verwalteten Kontext beendet (d. h. zum Übergang zum Standardkontext), bevor diese Methode ausgeführt wird. Der Thread kehrt zum ursprünglichen Nicht-Standardkontext zurück, nachdem der Aufruf dieser Methode abgeschlossen wurde.
Das Beenden des Kontexts kann nützlich sein, wenn die kontextgebundene Klasse über das SynchronizationAttribute Attribut verfügt. In diesem Fall werden alle Aufrufe an Member der Klasse automatisch synchronisiert, und die Synchronisierungsdomäne ist der gesamte Codetext für die Klasse. Wenn Code im Aufrufstapel eines Mitglieds diese Methode aufruft und angibt trueexitContext, beendet der Thread die Synchronisierungsdomäne, wodurch ein Thread, der für einen Aufruf eines Elements des Objekts blockiert wird, beendet wird. Wenn diese Methode zurückgegeben wird, muss der Thread, der den Aufruf ausgeführt hat, warten, um die Synchronisierungsdomäne erneut einzuweisen.
Gilt für:
WaitAll(WaitHandle[], Int32, Boolean)
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein Int32 Wert verwendet wird, um das Zeitintervall anzugeben und anzugeben, ob die Synchronisierungsdomäne vor der Wartezeit beendet werden soll.
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
Parameter
- waitHandles
- WaitHandle[]
Ein WaitHandle Array, das die Objekte enthält, für die die aktuelle Instanz wartet. Dieses Array darf nicht mehrere Verweise auf dasselbe Objekt (Duplikate) enthalten.
- millisecondsTimeout
- Int32
Die Anzahl der zu wartenden Millisekunden oder Infinite (-1) auf unbestimmte Zeit.
- exitContext
- Boolean
trueum die Synchronisierungsdomäne für den Kontext vor der Wartezeit zu beenden (falls in einem synchronisierten Kontext), und bitten Sie sie danach erneut; andernfalls . false
Gibt zurück
truewenn jedes Element in waitHandles ein Signal empfangen hat; andernfalls . false
Ausnahmen
Der waitHandles Parameter ist null.
- oder -
Mindestens eines der Objekte im waitHandles Array ist null.
- oder -
waitHandles ist ein Array ohne Elemente, und die .NET Framework-Version ist 2.0 oder höher.
Das waitHandles Array enthält Elemente, die Duplikate sind.
Die Anzahl der Objekte waitHandles ist größer als das System zulässig ist.
- oder -
Der aktuelle Thread befindet sich im STA Zustand und waitHandles enthält mehr als ein Element.
waitHandles ist ein Array ohne Elemente, und die .NET Framework-Version ist 1.0 oder 1.1.
millisecondsTimeout ist eine andere negative Zahl als -1, die ein unendliches Timeout darstellt.
Die Wartezeit wurde abgeschlossen, da ein Thread beendet wurde, ohne einen Mutex freizugeben.
Das waitHandles Array enthält einen transparenten Proxy für eine in einer WaitHandle anderen Anwendungsdomäne.
Beispiele
Das folgende Codebeispiel zeigt, wie Sie den Threadpool zum asynchronen Erstellen und Schreiben in eine Gruppe von Dateien verwenden. Jeder Schreibvorgang wird als Arbeitsaufgabe in die Warteschlange gestellt und signalisiert, wann er abgeschlossen ist. Der Hauptthread wartet, bis alle Elemente signalisiert und dann beendet werden.
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
Hinweise
Wenn millisecondsTimeout null ist, wird die Methode nicht blockiert. Er testet den Zustand der Wartepunkte und gibt sofort zurück.
Wenn ein Mutex abgebrochen wird, wird ein AbandonedMutexException Geworfen. Ein verlassener Mutex weist häufig auf einen schwerwiegenden Codierungsfehler hin. Bei einem systemweiten Mutex kann es darauf hindeuten, dass eine Anwendung abrupt beendet wurde (z. B. mithilfe des Windows-Task-Managers). Die Ausnahme enthält Informationen, die für das Debuggen hilfreich sind.
Die WaitAll Methode gibt zurück, wenn die Wartezeit beendet wird, was bedeutet, dass entweder alle Ziehpunkte signalisiert werden oder wenn Timeout auftritt. Wenn mehr als 64 Ziehpunkte übergeben werden, wird ein NotSupportedException Fehler ausgelöst. Wenn im Array Duplikate vorhanden sind, schlägt der Aufruf mit einem DuplicateWaitObjectException.
Beenden des Kontexts
Der exitContext Parameter hat keine Auswirkung, es sei denn, diese Methode wird aus einem nicht standardmäßigen verwalteten Kontext aufgerufen. Der verwaltete Kontext kann nicht standardmäßig sein, wenn sich Ihr Thread in einem Aufruf einer Instanz einer von einer Klasse abgeleiteten Klasse befindet ContextBoundObject. Auch wenn Sie derzeit eine Methode für eine Klasse ausführen, die nicht von ContextBoundObject, z String. B. abgeleitet ist, können Sie sich in einem nicht standardmäßigen Kontext befinden, wenn sich ein ContextBoundObject Stapel in der aktuellen Anwendungsdomäne befindet.
Wenn Der Code in einem nicht standardmäßigen Kontext ausgeführt wird, geben Sie true an exitContext , dass der Thread den nicht standardmäßigen verwalteten Kontext beendet (d. h. zum Übergang zum Standardkontext), bevor diese Methode ausgeführt wird. Der Thread kehrt zum ursprünglichen Nicht-Standardkontext zurück, nachdem der Aufruf dieser Methode abgeschlossen wurde.
Das Beenden des Kontexts kann nützlich sein, wenn die kontextgebundene Klasse über das SynchronizationAttribute Attribut verfügt. In diesem Fall werden alle Aufrufe an Member der Klasse automatisch synchronisiert, und die Synchronisierungsdomäne ist der gesamte Codetext für die Klasse. Wenn Code im Aufrufstapel eines Mitglieds diese Methode aufruft und angibt trueexitContext, beendet der Thread die Synchronisierungsdomäne, wodurch ein Thread, der für einen Aufruf eines Elements des Objekts blockiert wird, beendet wird. Wenn diese Methode zurückgegeben wird, muss der Thread, der den Aufruf ausgeführt hat, warten, um die Synchronisierungsdomäne erneut einzuweisen.
Gilt für:
WaitAll(WaitHandle[], TimeSpan)
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein TimeSpan Wert verwendet wird, um das Zeitintervall anzugeben.
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
Parameter
- waitHandles
- WaitHandle[]
Ein WaitHandle Array, das die Objekte enthält, für die die aktuelle Instanz wartet. Dieses Array darf nicht mehrere Verweise auf dasselbe Objekt enthalten.
- timeout
- TimeSpan
Ein TimeSpan Wert, der die Anzahl der zu wartenden Millisekunden darstellt, oder eine TimeSpan , die -1 Millisekunden darstellt, um unbegrenzt zu warten.
Gibt zurück
truewenn jedes Element in waitHandles ein Signal empfangen hat; andernfalls . false
Ausnahmen
Der waitHandles Parameter ist null.
- oder -
Mindestens eines der Objekte im waitHandles Array ist null.
- oder -
waitHandles ist ein Array ohne Elemente.
Das waitHandles Array enthält Elemente, die Duplikate sind.
Die Anzahl der Objekte waitHandles ist größer als das System zulässig ist.
- oder -
Der aktuelle Thread befindet sich im STA Zustand und waitHandles enthält mehr als ein Element.
timeout ist eine andere negative Zahl als -1 Millisekunden, die ein unendliches Timeout darstellt.
- oder -
timeout ist größer als Int32.MaxValue.
Die Wartezeit wurde beendet, da ein Thread beendet wurde, ohne einen Mutex freizugeben.
Das waitHandles Array enthält einen transparenten Proxy für eine in einer WaitHandle anderen Anwendungsdomäne.
Hinweise
Wenn timeout null ist, wird die Methode nicht blockiert. Er testet den Zustand der Wartepunkte und gibt sofort zurück.
Die WaitAll Methode gibt zurück, wenn die Wartezeit beendet wird, was bedeutet, dass entweder alle Ziehpunkte signalisiert oder ein Timeout auftritt. Wenn mehr als 64 Ziehpunkte übergeben werden, wird ein NotSupportedException Fehler ausgelöst. Wenn das Array Duplikate enthält, schlägt der Aufruf fehl.
Der maximal zulässige Wert timeout ist Int32.MaxValue.
Das Aufrufen dieser Methodenüberladung entspricht dem Aufrufen der WaitAll(WaitHandle[], TimeSpan, Boolean) Überladung und der Angabe false für exitContext.
Gilt für:
WaitAll(WaitHandle[], Int32)
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen, wobei ein Int32 Wert verwendet wird, um das Zeitintervall anzugeben.
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
Parameter
- waitHandles
- WaitHandle[]
Ein WaitHandle Array, das die Objekte enthält, für die die aktuelle Instanz wartet. Dieses Array darf nicht mehrere Verweise auf dasselbe Objekt (Duplikate) enthalten.
- millisecondsTimeout
- Int32
Die Anzahl der zu wartenden Millisekunden oder Infinite (-1) auf unbestimmte Zeit.
Gibt zurück
truewenn jedes Element in waitHandles ein Signal empfangen hat; andernfalls . false
Ausnahmen
Der waitHandles Parameter ist null.
- oder -
Mindestens eines der Objekte im waitHandles Array ist null.
- oder -
waitHandles ist ein Array ohne Elemente.
Das waitHandles Array enthält Elemente, die Duplikate sind.
Die Anzahl der Objekte waitHandles ist größer als das System zulässig ist.
- oder -
Der aktuelle Thread befindet sich im STA Zustand und waitHandles enthält mehr als ein Element.
millisecondsTimeout ist eine andere negative Zahl als -1, die ein unendliches Timeout darstellt.
Die Wartezeit wurde abgeschlossen, da ein Thread beendet wurde, ohne einen Mutex freizugeben.
Das waitHandles Array enthält einen transparenten Proxy für eine in einer WaitHandle anderen Anwendungsdomäne.
Hinweise
Wenn millisecondsTimeout null ist, wird die Methode nicht blockiert. Er testet den Zustand der Wartepunkte und gibt sofort zurück.
Die WaitAll Methode gibt zurück, wenn die Wartezeit beendet wird, was bedeutet, dass entweder alle Ziehpunkte signalisiert werden oder wenn Timeout auftritt. Wenn mehr als 64 Ziehpunkte übergeben werden, wird ein NotSupportedException Fehler ausgelöst. Wenn im Array Duplikate vorhanden sind, schlägt der Aufruf mit einem DuplicateWaitObjectException.
Das Aufrufen dieser Methodenüberladung entspricht dem Aufrufen der WaitAll(WaitHandle[], Int32, Boolean) Überladung und der Angabe false für exitContext.
Gilt für:
WaitAll(WaitHandle[])
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
- Quelle:
- WaitHandle.cs
Wartet auf alle Elemente im angegebenen Array, um ein Signal zu empfangen.
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
Parameter
- waitHandles
- WaitHandle[]
Ein WaitHandle Array, das die Objekte enthält, für die die aktuelle Instanz wartet. Dieses Array darf nicht mehrere Verweise auf dasselbe Objekt enthalten.
Gibt zurück
true wenn jedes Element in waitHandles ein Signal empfangen hat; andernfalls gibt die Methode nie zurück.
Ausnahmen
Der waitHandles Parameter ist null. - oder -
Mindestens eines der Objekte im waitHandles Array ist null.
- oder -
waitHandles ist ein Array ohne Elemente, und die .NET Framework-Version ist 2.0 oder höher.
Das waitHandles Array enthält Elemente, die Duplikate sind.
Die Anzahl der Objekte waitHandles ist größer als das System zulässig ist.
- oder -
Der aktuelle Thread befindet sich im STA Zustand und waitHandles enthält mehr als ein Element.
waitHandles ist ein Array ohne Elemente, und die .NET Framework-Version ist 1.0 oder 1.1.
Die Wartezeit wurde beendet, da ein Thread beendet wurde, ohne einen Mutex freizugeben.
Das waitHandles Array enthält einen transparenten Proxy für eine in einer WaitHandle anderen Anwendungsdomäne.
Beispiele
Das folgende Codebeispiel zeigt, wie Sie den Threadpool zum asynchronen Erstellen und Schreiben in eine Gruppe von Dateien verwenden. Jeder Schreibvorgang wird als Arbeitsaufgabe in die Warteschlange gestellt und signalisiert, wann er abgeschlossen ist. Der Hauptthread wartet, bis alle Elemente signalisiert und dann beendet werden.
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
Hinweise
AbandonedMutexException ist neu in .NET Framework, Version 2.0. In früheren Versionen gibt die WaitAll Methode zurück true , wenn ein Mutex abgebrochen wird. Ein verlassener Mutex weist häufig auf einen schwerwiegenden Codierungsfehler hin. Bei einem systemweiten Mutex kann es darauf hindeuten, dass eine Anwendung abrupt beendet wurde (z. B. mithilfe des Windows-Task-Managers). Die Ausnahme enthält Informationen, die für das Debuggen hilfreich sind.
Die WaitAll Methode gibt zurück, wenn alle Ziehpunkte signalisiert werden. Wenn mehr als 64 Ziehpunkte übergeben werden, wird ein NotSupportedException Fehler ausgelöst. Wenn das Array Duplikate enthält, schlägt der Aufruf mit einem DuplicateWaitObjectException.
Das Aufrufen dieser Methodenüberladung entspricht dem Aufrufen der WaitAll(WaitHandle[], Int32, Boolean) Methodenüberladung und dem Angeben von -1 (oder Timeout.Infinite) für millisecondsTimeout und true für exitContext.