WaitHandle.WaitAll Metódus

Definíció

Megvárja, amíg a megadott tömb összes eleme megkapja a jelet.

Túlterhelések

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

Megvárja, amíg a megadott tömb összes eleme jelet kap, egy érték használatával TimeSpan megadja az időintervallumot, és megadja, hogy a várakozás előtt kilép-e a szinkronizálási tartományból.

WaitAll(WaitHandle[], Int32, Boolean)

Megvárja, amíg a megadott tömb összes eleme jelet kap, egy érték használatával Int32 megadja az időintervallumot, és megadja, hogy a várakozás előtt kilép-e a szinkronizálási tartományból.

WaitAll(WaitHandle[], TimeSpan)

Megvárja, amíg a megadott tömb összes eleme jelet kap egy érték használatával TimeSpan az időintervallum megadásához.

WaitAll(WaitHandle[], Int32)

Megvárja, amíg a megadott tömb összes eleme jelet kap egy érték használatával Int32 az időintervallum megadásához.

WaitAll(WaitHandle[])

Megvárja, amíg a megadott tömb összes eleme megkapja a jelet.

WaitAll(WaitHandle[], TimeSpan, Boolean)

Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs

Megvárja, amíg a megadott tömb összes eleme jelet kap, egy érték használatával TimeSpan megadja az időintervallumot, és megadja, hogy a várakozás előtt kilép-e a szinkronizálási tartományból.

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

Paraméterek

waitHandles
WaitHandle[]

Olyan WaitHandle tömb, amely azokat az objektumokat tartalmazza, amelyekre az aktuális példány várni fog. Ez a tömb nem tartalmazhat ugyanahhoz az objektumhoz több hivatkozást.

timeout
TimeSpan

A TimeSpan várakozni kívánt ezredmásodpercek számát, vagy TimeSpan az -1 ezredmásodpercet a határozatlan idejű várakozáshoz.

exitContext
Boolean

truea várakozás előtt (ha szinkronizált környezetben) ki szeretne lépni a környezet szinkronizálási tartományból, és ezt követően újból meg kell keresnie; egyéb esetben. false

Válaszok

true ha minden elem waitHandles kapott egy jelet; ellenkező esetben false.

Kivételek

A waitHandles paraméter a következő null: .

-vagy-

A tömb egy vagy több objektuma az waitHandlesnull.

-vagy-

waitHandles egy olyan tömb, amely nem rendelkezik elemekkel, és a .NET-keretrendszer verziója 2.0-s vagy újabb.

A waitHandles tömb ismétlődő elemeket tartalmaz.

A benne lévő waitHandles objektumok száma nagyobb, mint amennyit a rendszer megenged.

-vagy-

Az STAThreadAttribute attribútum az aktuális szál szál-eljárására lesz alkalmazva, és waitHandles több elemet tartalmaz.

waitHandles egy olyan tömb, amely nem rendelkezik elemekkel, és a .NET-keretrendszer verziója 1.0 vagy 1.1.

timeout a -1 ezredmásodpercen kívüli negatív szám, amely végtelen időtúllépést jelöl.

-vagy-

timeout nagyobb, mint az Int32.MaxValue.

A várakozás leállt, mert egy szál a mutex feloldása nélkül lépett ki.

A waitHandles tömb egy másik alkalmazástartományban lévő egy transzparens proxyt WaitHandle tartalmaz.

Példák

Az alábbi példakód bemutatja, hogyan lehet a szálkészletet aszinkron módon létrehozni és fájlcsoportba írni. Minden írási művelet munkaelemként van várólistára állítva, és jelzi, ha befejeződött. A fő szál megvárja, amíg az összes elem jelez, majd kilép.

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

Megjegyzések

Ha timeout nulla, a metódus nem blokkolja a elemet. Teszteli a várakozási fogópontok állapotát, és azonnal visszatér.

Ha egy mutex elhagyatott, egy AbandonedMutexException dobni. Az elhagyott mutex gyakran komoly kódolási hibát jelez. Rendszerszintű mutex esetén azt jelezheti, hogy egy alkalmazás hirtelen leállt (például Windows Task Manager használatával). A kivétel a hibakereséshez hasznos információkat tartalmaz.

A WaitAll metódus a várakozás leállásakor ad vissza, ami azt jelenti, hogy a rendszer az összes fogópontot jelzi, vagy időtúllépés történik. Ha 64-nél több fogópontot adnak át, NotSupportedException a ki lesz dobva. Ha a tömb duplikált elemeket tartalmaz, a hívás sikertelen lesz.

Note

A WaitAll metódus nem támogatott állapotban lévő STA szálakon.

A maximális érték az timeout .Int32.MaxValue

Kilépés a környezetből

A exitContext paraméternek nincs hatása, hacsak ezt a metódust nem egy nem megbízható felügyelt környezetből hívja meg. A felügyelt környezet nem lehet hibás, ha a szál egy, a forrásból ContextBoundObjectszármaztatott osztály egy példányának hívásán belül van. Még akkor is, ha egy olyan osztályon hajt végre metódust, amely nem származik ContextBoundObjectpéldául Stringabból, akkor is lehet nem megfelelő környezetben, ha egy ContextBoundObject az aktuális alkalmazástartományban található a veremen.

Ha a kód nem megfelelő környezetben fut, a metódus végrehajtása előtt meg kell adnia trueexitContext , hogy a szál kilép-e a nemdefault felügyelt környezetből (vagyis áttér az alapértelmezett környezetre). A szál a metódus hívásának befejeződése után visszatér az eredeti nem megfelelő környezethez.

A környezetből való kilépés akkor lehet hasznos, ha a környezethez kötött osztály rendelkezik az SynchronizationAttribute attribútummal. Ebben az esetben a rendszer automatikusan szinkronizálja az osztály tagjaihoz intézett összes hívást, és a szinkronizálási tartomány az osztály kódjának teljes törzse. Ha egy tag hívási vermében lévő kód meghívja ezt a metódust, és megadja trueexitContextazt, a szál kilép a szinkronizálási tartományból, ami lehetővé teszi, hogy az objektum bármely tagjára irányuló hívás során blokkolt szál folytassa a műveletet. Amikor ez a metódus visszatér, a hívást kezdeményező szálnak várnia kell a szinkronizálási tartomány újraküldésére.

A következőre érvényes:

WaitAll(WaitHandle[], Int32, Boolean)

Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs

Megvárja, amíg a megadott tömb összes eleme jelet kap, egy érték használatával Int32 megadja az időintervallumot, és megadja, hogy a várakozás előtt kilép-e a szinkronizálási tartományból.

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

Paraméterek

waitHandles
WaitHandle[]

Olyan WaitHandle tömb, amely azokat az objektumokat tartalmazza, amelyekre az aktuális példány várni fog. Ez a tömb nem tartalmazhat ugyanahhoz az objektumhoz (duplikált) több hivatkozást.

millisecondsTimeout
Int32

A várakozni kívánt ezredmásodpercek száma, vagy Infinite (-1) a határozatlan ideig történő várakozáshoz.

exitContext
Boolean

truea várakozás előtt (ha szinkronizált környezetben) ki szeretne lépni a környezet szinkronizálási tartományból, és ezt követően újból meg kell keresnie; egyéb esetben. false

Válaszok

trueha minden elem waitHandles kapott egy jelet; ellenkező esetben. false

Kivételek

A waitHandles paraméter a következő null: .

-vagy-

A tömb egy vagy több objektuma az waitHandlesnull.

-vagy-

waitHandles egy olyan tömb, amely nem rendelkezik elemekkel, és a .NET-keretrendszer verziója 2.0-s vagy újabb.

A waitHandles tömb ismétlődő elemeket tartalmaz.

A benne lévő waitHandles objektumok száma nagyobb, mint amennyit a rendszer megenged.

-vagy-

Az aktuális szál állapotban STA van, és waitHandles több elemet tartalmaz.

waitHandles egy olyan tömb, amely nem rendelkezik elemekkel, és a .NET-keretrendszer verziója 1.0 vagy 1.1.

millisecondsTimeout a negatív szám nem -1, ami végtelen időtúllépést jelöl.

A várakozás befejeződött, mert egy szál a mutex feloldása nélkül lépett ki.

A waitHandles tömb egy másik alkalmazástartományban lévő egy transzparens proxyt WaitHandle tartalmaz.

Példák

Az alábbi példakód bemutatja, hogyan lehet a szálkészletet aszinkron módon létrehozni és fájlcsoportba írni. Minden írási művelet munkaelemként van várólistára állítva, és jelzi, ha befejeződött. A fő szál megvárja, amíg az összes elem jelez, majd kilép.

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

Megjegyzések

Ha millisecondsTimeout nulla, a metódus nem blokkolja a elemet. Teszteli a várakozási fogópontok állapotát, és azonnal visszatér.

Ha egy mutex elhagyatott, egy AbandonedMutexException dobni. Az elhagyott mutex gyakran komoly kódolási hibát jelez. Rendszerszintű mutex esetén azt jelezheti, hogy egy alkalmazás hirtelen leállt (például Windows Task Manager használatával). A kivétel a hibakereséshez hasznos információkat tartalmaz.

A WaitAll metódus a várakozás leállásakor ad vissza, ami azt jelenti, hogy az összes fogópont jelzése vagy időtúllépés esetén történik. Ha 64-nél több fogópontot adnak át, NotSupportedException a ki lesz dobva. Ha a tömbben ismétlődések vannak, a hívás meghiúsul egy DuplicateWaitObjectException.

Note

A WaitAll metódus nem támogatott állapotban lévő STA szálakon.

Kilépés a környezetből

A exitContext paraméternek nincs hatása, hacsak ezt a metódust nem egy nem megbízható felügyelt környezetből hívja meg. A felügyelt környezet nem lehet hibás, ha a szál egy, a forrásból ContextBoundObjectszármaztatott osztály egy példányának hívásán belül van. Még akkor is, ha egy olyan osztályon hajt végre metódust, amely nem származik ContextBoundObjectpéldául Stringabból, akkor is lehet nem megfelelő környezetben, ha egy ContextBoundObject az aktuális alkalmazástartományban található a veremen.

Ha a kód nem megfelelő környezetben fut, a metódus végrehajtása előtt meg kell adnia trueexitContext , hogy a szál kilép-e a nemdefault felügyelt környezetből (vagyis áttér az alapértelmezett környezetre). A szál a metódus hívásának befejeződése után visszatér az eredeti nem megfelelő környezethez.

A környezetből való kilépés akkor lehet hasznos, ha a környezethez kötött osztály rendelkezik az SynchronizationAttribute attribútummal. Ebben az esetben a rendszer automatikusan szinkronizálja az osztály tagjaihoz intézett összes hívást, és a szinkronizálási tartomány az osztály kódjának teljes törzse. Ha egy tag hívási vermében lévő kód meghívja ezt a metódust, és megadja trueexitContextazt, a szál kilép a szinkronizálási tartományból, ami lehetővé teszi, hogy az objektum bármely tagjára irányuló hívás során blokkolt szál folytassa a műveletet. Amikor ez a metódus visszatér, a hívást kezdeményező szálnak várnia kell a szinkronizálási tartomány újraküldésére.

A következőre érvényes:

WaitAll(WaitHandle[], TimeSpan)

Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs

Megvárja, amíg a megadott tömb összes eleme jelet kap egy érték használatával TimeSpan az időintervallum megadásához.

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

Paraméterek

waitHandles
WaitHandle[]

Olyan WaitHandle tömb, amely azokat az objektumokat tartalmazza, amelyekre az aktuális példány várni fog. Ez a tömb nem tartalmazhat ugyanahhoz az objektumhoz több hivatkozást.

timeout
TimeSpan

A TimeSpan várakozni kívánt ezredmásodpercek számát, vagy TimeSpan az -1 ezredmásodpercet a határozatlan idejű várakozáshoz.

Válaszok

trueha minden elem waitHandles kapott egy jelet; ellenkező esetben. false

Kivételek

A waitHandles paraméter a következő null: .

-vagy-

A tömb egy vagy több objektuma az waitHandlesnull.

-vagy-

waitHandles olyan tömb, amely nem rendelkezik elemekkel.

A waitHandles tömb ismétlődő elemeket tartalmaz.

Megjegyzés: Az Windows Áruházbeli alkalmazások .NET vagy a Portable Class Library esetében inkább az alaposztály kivételét,ArgumentException.

A benne lévő waitHandles objektumok száma nagyobb, mint amennyit a rendszer megenged.

-vagy-

Az aktuális szál állapotban STA van, és waitHandles több elemet tartalmaz.

timeout a -1 ezredmásodpercen kívüli negatív szám, amely végtelen időtúllépést jelöl.

-vagy-

timeout nagyobb, mint az Int32.MaxValue.

A várakozás leállt, mert egy szál a mutex feloldása nélkül lépett ki.

A waitHandles tömb egy másik alkalmazástartományban lévő egy transzparens proxyt WaitHandle tartalmaz.

Megjegyzések

Ha timeout nulla, a metódus nem blokkolja a elemet. Teszteli a várakozási fogópontok állapotát, és azonnal visszatér.

A WaitAll metódus a várakozás leállásakor ad vissza, ami azt jelenti, hogy a rendszer az összes fogópontot jelzi, vagy időtúllépés történik. Ha 64-nél több fogópontot adnak át, NotSupportedException a ki lesz dobva. Ha a tömb duplikált elemeket tartalmaz, a hívás sikertelen lesz.

Note

A WaitAll metódus nem támogatott állapotban lévő STA szálakon.

A maximális érték az timeout .Int32.MaxValue

A metódus túlterhelésének meghívása ugyanaz, mint a WaitAll(WaitHandle[], TimeSpan, Boolean) túlterhelés meghívása falseexitContext és a túlterhelés megadása.

A következőre érvényes:

WaitAll(WaitHandle[], Int32)

Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs

Megvárja, amíg a megadott tömb összes eleme jelet kap egy érték használatával Int32 az időintervallum megadásához.

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

Paraméterek

waitHandles
WaitHandle[]

Olyan WaitHandle tömb, amely azokat az objektumokat tartalmazza, amelyekre az aktuális példány várni fog. Ez a tömb nem tartalmazhat ugyanahhoz az objektumhoz (duplikált) több hivatkozást.

millisecondsTimeout
Int32

A várakozni kívánt ezredmásodpercek száma, vagy Infinite (-1) a határozatlan ideig történő várakozáshoz.

Válaszok

trueha minden elem waitHandles kapott egy jelet; ellenkező esetben. false

Kivételek

A waitHandles paraméter a következő null: .

-vagy-

A tömb egy vagy több objektuma az waitHandlesnull.

-vagy-

waitHandles olyan tömb, amely nem rendelkezik elemekkel.

A waitHandles tömb ismétlődő elemeket tartalmaz.

Megjegyzés: Az Windows Áruházbeli alkalmazások .NET vagy a Portable Class Library esetében inkább az alaposztály kivételét,ArgumentException.

A benne lévő waitHandles objektumok száma nagyobb, mint amennyit a rendszer megenged.

-vagy-

Az aktuális szál állapotban STA van, és waitHandles több elemet tartalmaz.

millisecondsTimeout a negatív szám nem -1, ami végtelen időtúllépést jelöl.

A várakozás befejeződött, mert egy szál a mutex feloldása nélkül lépett ki.

A waitHandles tömb egy másik alkalmazástartományban lévő egy transzparens proxyt WaitHandle tartalmaz.

Megjegyzések

Ha millisecondsTimeout nulla, a metódus nem blokkolja a elemet. Teszteli a várakozási fogópontok állapotát, és azonnal visszatér.

A WaitAll metódus a várakozás leállásakor ad vissza, ami azt jelenti, hogy az összes fogópont jelzése vagy időtúllépés esetén történik. Ha 64-nél több fogópontot adnak át, NotSupportedException a ki lesz dobva. Ha a tömbben ismétlődések vannak, a hívás meghiúsul egy DuplicateWaitObjectException.

Note

A WaitAll metódus nem támogatott állapotban lévő STA szálakon.

A metódus túlterhelésének meghívása ugyanaz, mint a WaitAll(WaitHandle[], Int32, Boolean) túlterhelés meghívása falseexitContext és a túlterhelés megadása.

A következőre érvényes:

WaitAll(WaitHandle[])

Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs
Forrás:
WaitHandle.cs

Megvárja, amíg a megadott tömb összes eleme megkapja a jelet.

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

Paraméterek

waitHandles
WaitHandle[]

Olyan WaitHandle tömb, amely azokat az objektumokat tartalmazza, amelyekre az aktuális példány várni fog. Ez a tömb nem tartalmazhat ugyanahhoz az objektumhoz több hivatkozást.

Válaszok

true ha minden elem waitHandles kapott egy jelet; ellenkező esetben a metódus soha nem tér vissza.

Kivételek

A waitHandles paraméter a következő null: . -vagy-

A tömb egy vagy több objektuma a waitHandles következő null.

-vagy-

waitHandles egy olyan tömb, amely nem rendelkezik elemekkel, és a .NET-keretrendszer verziója 2.0-s vagy újabb.

A waitHandles tömb ismétlődő elemeket tartalmaz.

Megjegyzés: Az Windows Áruházbeli alkalmazások .NET vagy a Portable Class Library esetében inkább az alaposztály kivételét,ArgumentException.

A benne lévő waitHandles objektumok száma nagyobb, mint amennyit a rendszer megenged.

-vagy-

Az aktuális szál állapotban STA van, és waitHandles több elemet tartalmaz.

waitHandles egy olyan tömb, amely nem rendelkezik elemekkel, és a .NET-keretrendszer verziója 1.0 vagy 1.1.

A várakozás leállt, mert egy szál a mutex feloldása nélkül lépett ki.

A waitHandles tömb egy másik alkalmazástartományban lévő egy transzparens proxyt WaitHandle tartalmaz.

Példák

Az alábbi példakód bemutatja, hogyan lehet a szálkészletet aszinkron módon létrehozni és fájlcsoportba írni. Minden írási művelet munkaelemként van várólistára állítva, és jelzi, ha befejeződött. A fő szál megvárja, amíg az összes elem jelez, majd kilép.

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

Megjegyzések

AbandonedMutexException a .NET Framework 2.0-s verziójában új. A korábbi verziókban a WaitAll metódus a mutex elhagyásakor ad vissza true . Az elhagyott mutex gyakran komoly kódolási hibát jelez. Rendszerszintű mutex esetén azt jelezheti, hogy egy alkalmazás hirtelen leállt (például Windows Task Manager használatával). A kivétel a hibakereséshez hasznos információkat tartalmaz.

A WaitAll metódus az összes fogópont jelzése után tér vissza. Ha 64-nél több fogópontot adnak át, NotSupportedException a ki lesz dobva. Ha a tömb duplikált elemeket tartalmaz, a hívás meghiúsul egy DuplicateWaitObjectException.

Note

A WaitAll metódus nem támogatott állapotban lévő STA szálakon.

A metódus túlterhelésének meghívása egyenértékű a metódus túlterhelésének meghívásával, valamint a WaitAll(WaitHandle[], Int32, Boolean) -1 (vagy Timeout.Infinite) millisecondsTimeouttrueexitContextmegadásával.

A következőre érvényes: