WaitHandle.WaitAny Metódus

Definíció

Megvárja, amíg a megadott tömb bármelyik eleme jelet kap.

Túlterhelések

Name Description
WaitAny(WaitHandle[])

Megvárja, amíg a megadott tömb bármelyik eleme jelet kap.

WaitAny(WaitHandle[], Int32)

Megvárja, amíg a megadott tömb bármelyik eleme megkapja a jelet, és egy 32 bites aláírt egész számmal adja meg az időintervallumot.

WaitAny(WaitHandle[], TimeSpan)

Megvárja, amíg a megadott tömb bármelyik eleme jelet kap az TimeSpan időintervallum megadásához.

WaitAny(WaitHandle[], Int32, Boolean)

Megvárja, amíg a megadott tömb bármelyik eleme jelet kap, egy 32 bites aláírt egész számmal megadva az időintervallumot, és megadja, hogy a várakozás előtt ki kell-e lépnie a szinkronizálási tartományból.

WaitAny(WaitHandle[], TimeSpan, Boolean)

Megvárja, amíg a megadott tömb bármelyik eleme jelet kap, az időintervallum megadásával és annak megadásával, TimeSpan hogy a várakozás előtt kilépjen-e a szinkronizálási tartományból.

WaitAny(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 bármelyik eleme jelet kap.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles);
public static int WaitAny(System.Threading.WaitHandle[] waitHandles);
static member WaitAny : System.Threading.WaitHandle[] -> int
Public Shared Function WaitAny (waitHandles As WaitHandle()) As Integer

Paraméterek

waitHandles
WaitHandle[]

Olyan WaitHandle tömb, amely azokat az objektumokat tartalmazza, amelyekre az aktuális példány várni fog.

Válaszok

A várakozást kielégítő objektum tömbindexe.

Kivételek

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

-vagy-

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

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

waitHandles elem nélküli tömb, és a .NET-keretrendszer verziója 1.0 vagy 1.1.

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

waitHandles elem nélküli tömb, és a .NET-keretrendszer verziója 2.0-s vagy újabb.

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 a metódus meghívását WaitAny .

using System;
using System.Threading;

public sealed class App
{
    // Define an array with two AutoResetEvent WaitHandles.
    static WaitHandle[] waitHandles = new WaitHandle[]
    {
        new AutoResetEvent(false),
        new AutoResetEvent(false)
    };

    // Define a random number generator for testing.
    static Random r = new Random();

    static void Main()
    {
        // Queue up two tasks on two different threads;
        // wait until all tasks are completed.
        DateTime dt = DateTime.Now;
        Console.WriteLine("Main thread is waiting for BOTH tasks to complete.");
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
        WaitHandle.WaitAll(waitHandles);
        // The time shown below should match the longest task.
        Console.WriteLine("Both tasks are completed (time waited={0})",
            (DateTime.Now - dt).TotalMilliseconds);

        // Queue up two tasks on two different threads;
        // wait until any task is completed.
        dt = DateTime.Now;
        Console.WriteLine();
        Console.WriteLine("The main thread is waiting for either task to complete.");
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
        int index = WaitHandle.WaitAny(waitHandles);
        // The time shown below should match the shortest task.
        Console.WriteLine("Task {0} finished first (time waited={1}).",
            index + 1, (DateTime.Now - dt).TotalMilliseconds);
    }

    static void DoTask(Object state)
    {
        AutoResetEvent are = (AutoResetEvent) state;
        int time = 1000 * r.Next(2, 10);
        Console.WriteLine("Performing a task for {0} milliseconds.", time);
        Thread.Sleep(time);
        are.Set();
    }
}

// This code produces output similar to the following:
//
//  Main thread is waiting for BOTH tasks to complete.
//  Performing a task for 7000 milliseconds.
//  Performing a task for 4000 milliseconds.
//  Both tasks are completed (time waited=7064.8052)
//
//  The main thread is waiting for either task to complete.
//  Performing a task for 2000 milliseconds.
//  Performing a task for 2000 milliseconds.
//  Task 1 finished first (time waited=2000.6528).
Imports System.Threading

NotInheritable Public Class App
    ' Define an array with two AutoResetEvent WaitHandles.
    Private Shared waitHandles() As WaitHandle = _
        {New AutoResetEvent(False), New AutoResetEvent(False)}
    
    ' Define a random number generator for testing.
    Private Shared r As New Random()
    
    <MTAThreadAttribute> _
    Public Shared Sub Main() 
        ' Queue two tasks on two different threads; 
        ' wait until all tasks are completed.
        Dim dt As DateTime = DateTime.Now
        Console.WriteLine("Main thread is waiting for BOTH tasks to complete.")
        ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(0))
        ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(1))
        WaitHandle.WaitAll(waitHandles)
        ' The time shown below should match the longest task.
        Console.WriteLine("Both tasks are completed (time waited={0})", _
            (DateTime.Now - dt).TotalMilliseconds)
        
        ' Queue up two tasks on two different threads; 
        ' wait until any tasks are completed.
        dt = DateTime.Now
        Console.WriteLine()
        Console.WriteLine("The main thread is waiting for either task to complete.")
        ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(0))
        ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(1))
        Dim index As Integer = WaitHandle.WaitAny(waitHandles)
        ' The time shown below should match the shortest task.
        Console.WriteLine("Task {0} finished first (time waited={1}).", _
            index + 1,(DateTime.Now - dt).TotalMilliseconds)
    
    End Sub
    
    Shared Sub DoTask(ByVal state As [Object]) 
        Dim are As AutoResetEvent = CType(state, AutoResetEvent)
        Dim time As Integer = 1000 * r.Next(2, 10)
        Console.WriteLine("Performing a task for {0} milliseconds.", time)
        Thread.Sleep(time)
        are.Set()
    
    End Sub
End Class

' This code produces output similar to the following:
'
'  Main thread is waiting for BOTH tasks to complete.
'  Performing a task for 7000 milliseconds.
'  Performing a task for 4000 milliseconds.
'  Both tasks are completed (time waited=7064.8052)
' 
'  The main thread is waiting for either task to complete.
'  Performing a task for 2000 milliseconds.
'  Performing a task for 2000 milliseconds.
'  Task 1 finished first (time waited=2000.6528).

Megjegyzések

AbandonedMutexException a .NET Framework 2.0-s verziójában új. A korábbi verziókban a WaitAny metódus akkor ad vissza true , ha a várakozás befejeződik, mert egy mutex el van hagyva. 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 WaitAny metódus csak akkor ad ki egy AbandonedMutexException hibát, ha a várakozás befejeződött egy elhagyatott mutex miatt. Ha waitHandles olyan felszabadult mutexet tartalmaz, amely alacsonyabb indexszámmal rendelkezik, mint az elhagyott mutex, a WaitAny metódus a szokásos módon fejeződik be, és a kivétel nem lesz kibocsátva.

Note

A .NET-keretrendszer 2.0-snál korábbi verzióiban ha egy szál Mutex explicit feloldása nélkül lép ki vagy megszakad, és a Mutex egy másik szálon lévő WaitAny tömb 0 (nulla) indexén van, a WaitAny által visszaadott index 0 helyett 128.

Ez a metódus bármely fogópont jelzésekor ad vissza. Ha egynél több objektum lesz jelezve a hívás során, a visszatérési érték a jelzett objektum tömbindexe, amely az összes jelzett objektum legkisebb indexértékével van megadva.

A várakozási fogók maximális száma 64, ha az aktuális szál STA állapota 63.

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 WaitAny(WaitHandle[], Int32, Boolean) -1 (vagy Timeout.Infinite) millisecondsTimeouttrueexitContextmegadásával.

A következőre érvényes:

WaitAny(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 bármelyik eleme megkapja a jelet, és egy 32 bites aláírt egész számmal adja meg az időintervallumot.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, int millisecondsTimeout);
public static int WaitAny(System.Threading.WaitHandle[] waitHandles, int millisecondsTimeout);
static member WaitAny : System.Threading.WaitHandle[] * int -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), millisecondsTimeout As Integer) As Integer

Paraméterek

waitHandles
WaitHandle[]

Olyan WaitHandle tömb, amely azokat az objektumokat tartalmazza, amelyekre az aktuális példány várni fog.

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

Annak az objektumnak a tömbindexe, amely teljesítette a várakozást, vagy WaitTimeout ha egy objektum sem teljesítette a várakozást, és az időintervallum megegyezik a millisecondsTimeout várakozással.

Kivételek

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

-vagy-

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

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

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.

waitHandles olyan tömb, amely nem rendelkezik elemekkel.

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 WaitAny metódus csak akkor ad ki egy AbandonedMutexException hibát, ha a várakozás befejeződött egy elhagyatott mutex miatt. Ha waitHandles olyan felszabadult mutexet tartalmaz, amely alacsonyabb indexszámmal rendelkezik, mint az elhagyott mutex, a WaitAny metódus a szokásos módon fejeződik be, és a kivétel nem lesz kibocsátva.

Ez a módszer akkor ad vissza, ha a várakozás leáll, vagy a fogópontok bármelyikét jelzi, vagy időtúllépés történik. Ha egynél több objektum lesz jelezve a hívás során, a visszatérési érték a jelzett objektum tömbindexe, amely az összes jelzett objektum legkisebb indexértékével van megadva.

A várakozási fogók maximális száma 64, ha az aktuális szál STA állapota 63.

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

A következőre érvényes:

WaitAny(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 bármelyik eleme jelet kap az TimeSpan időintervallum megadásához.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, TimeSpan timeout);
public static int WaitAny(System.Threading.WaitHandle[] waitHandles, TimeSpan timeout);
static member WaitAny : System.Threading.WaitHandle[] * TimeSpan -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), timeout As TimeSpan) As Integer

Paraméterek

waitHandles
WaitHandle[]

Olyan WaitHandle tömb, amely azokat az objektumokat tartalmazza, amelyekre az aktuális példány várni fog.

timeout
TimeSpan

Ez TimeSpan a várakozási idő ezredmásodperc, vagy egy TimeSpan olyan érték, amely -1 ezredmásodpercet jelöl a határozatlan ideig történő várakozáshoz.

Válaszok

Annak az objektumnak a tömbindexe, amely teljesítette a várakozást, vagy WaitTimeout ha egy objektum sem teljesítette a várakozást, és az időintervallum megegyezik a timeout várakozással.

Kivételek

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

-vagy-

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

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

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 befejeződött, mert egy szál a mutex feloldása nélkül lépett ki.

waitHandles olyan tömb, amely nem rendelkezik elemekkel.

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 WaitAny metódus csak akkor ad ki egy AbandonedMutexException hibát, ha a várakozás befejeződött egy elhagyatott mutex miatt. Ha waitHandles olyan felszabadult mutexet tartalmaz, amely alacsonyabb indexszámmal rendelkezik, mint az elhagyott mutex, a WaitAny metódus a szokásos módon fejeződik be, és a kivétel nem lesz kibocsátva.

Ez a módszer akkor ad vissza, ha a várakozás leáll, vagy a fogópontok bármelyikét jelzi, vagy időtúllépés történik. Ha egynél több objektum lesz jelezve a hívás során, a visszatérési érték a jelzett objektum tömbindexe, amely az összes jelzett objektum legkisebb indexértékével van megadva.

A várakozási fogók maximális száma 64, ha az aktuális szál STA állapota 63.

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

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

A következőre érvényes:

WaitAny(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 bármelyik eleme jelet kap, egy 32 bites aláírt egész számmal megadva az időintervallumot, és megadja, hogy a várakozás előtt ki kell-e lépnie a szinkronizálási tartományból.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, int millisecondsTimeout, bool exitContext);
public static int WaitAny(System.Threading.WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext);
static member WaitAny : System.Threading.WaitHandle[] * int * bool -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), millisecondsTimeout As Integer, exitContext As Boolean) As Integer

Paraméterek

waitHandles
WaitHandle[]

Olyan WaitHandle tömb, amely azokat az objektumokat tartalmazza, amelyekre az aktuális példány várni fog.

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

Annak az objektumnak a tömbindexe, amely teljesítette a várakozást, vagy WaitTimeout ha egy objektum sem teljesítette a várakozást, és az időintervallum megegyezik a millisecondsTimeout várakozással.

Kivételek

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

-vagy-

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

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

waitHandles elem nélküli tömb, é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.

waitHandles elem nélküli tömb, és a .NET-keretrendszer verziója 2.0-s vagy újabb.

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 használható a szálkészlet egy fájl egyidejű keresésére több lemezen. A hely szempontjából a rendszer csak az egyes lemezek gyökérkönyvtárát keresi.

using System;
using System.IO;
using System.Threading;

class Test
{
    static void Main()
    {
        Search search = new Search();
        search.FindFile("SomeFile.dat");
    }
}

class Search
{
    // Maintain state information to pass to FindCallback.
    class State
    {
        public AutoResetEvent autoEvent;
        public string         fileName;

        public State(AutoResetEvent autoEvent, string fileName)
        {
            this.autoEvent    = autoEvent;
            this.fileName     = fileName;
        }
    }

    AutoResetEvent[] autoEvents;
    String[] diskLetters;

    public Search()
    {
        // Retrieve an array of disk letters.
        diskLetters = Environment.GetLogicalDrives();

        autoEvents = new AutoResetEvent[diskLetters.Length];
        for(int i = 0; i < diskLetters.Length; i++)
        {
            autoEvents[i] = new AutoResetEvent(false);
        }
    }

    // Search for fileName in the root directory of all disks.
    public void FindFile(string fileName)
    {
        for(int i = 0; i < diskLetters.Length; i++)
        {
            Console.WriteLine("Searching for {0} on {1}.",
                fileName, diskLetters[i]);
            ThreadPool.QueueUserWorkItem(
                new WaitCallback(FindCallback), 
                new State(autoEvents[i], diskLetters[i] + fileName));
        }

        // Wait for the first instance of the file to be found.
        int index = WaitHandle.WaitAny(autoEvents, 3000, false);
        if(index == WaitHandle.WaitTimeout)
        {
            Console.WriteLine("\n{0} not found.", fileName);
        }
        else
        {
            Console.WriteLine("\n{0} found on {1}.", fileName,
                diskLetters[index]);
        }
    }

    // Search for stateInfo.fileName.
    void FindCallback(object state)
    {
        State stateInfo = (State)state;

        // Signal if the file is found.
        if(File.Exists(stateInfo.fileName))
        {
            stateInfo.autoEvent.Set();
        }
    }
}
Imports System.IO
Imports System.Threading

Public Class Test

    <MTAThread> _
    Shared Sub Main()
        Dim search As New Search()
        search.FindFile("SomeFile.dat")
    End Sub    
End Class

Public Class Search

    ' Maintain state information to pass to FindCallback.
    Class State
        Public autoEvent As AutoResetEvent 
        Public fileName As String         

        Sub New(anEvent As AutoResetEvent, fName As String)
            autoEvent = anEvent
            fileName = fName
        End Sub
    End Class

    Dim autoEvents() As AutoResetEvent
    Dim diskLetters() As String

    Sub New()

        ' Retrieve an array of disk letters.
        diskLetters = Environment.GetLogicalDrives()

        autoEvents = New AutoResetEvent(diskLetters.Length - 1) {}
        For i As Integer = 0 To diskLetters.Length - 1
            autoEvents(i) = New AutoResetEvent(False)
        Next i
    End Sub    
    
    ' Search for fileName in the root directory of all disks.
    Sub FindFile(fileName As String)
        For i As Integer = 0 To diskLetters.Length - 1
            Console.WriteLine("Searching for {0} on {1}.", _
                fileName, diskLetters(i))
        
            ThreadPool.QueueUserWorkItem(AddressOf FindCallback, _ 
                New State(autoEvents(i), diskLetters(i) & fileName))
        Next i

        ' Wait for the first instance of the file to be found.
        Dim index As Integer = _
            WaitHandle.WaitAny(autoEvents, 3000, False)
        If index = WaitHandle.WaitTimeout
            Console.WriteLine(vbCrLf & "{0} not found.", fileName)
        Else
            Console.WriteLine(vbCrLf & "{0} found on {1}.", _
                fileName, diskLetters(index))
        End If
    End Sub

    ' Search for stateInfo.fileName.
    Sub FindCallback(state As Object)
        Dim stateInfo As State = DirectCast(state, State)

        ' Signal if the file is found.
        If File.Exists(stateInfo.fileName) Then
            stateInfo.autoEvent.Set()
        End If
    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.

A WaitAny metódus csak akkor ad ki egy AbandonedMutexException hibát, ha a várakozás befejeződött egy elhagyatott mutex miatt. Ha waitHandles olyan felszabadult mutexet tartalmaz, amely alacsonyabb indexszámmal rendelkezik, mint az elhagyott mutex, a WaitAny metódus a szokásos módon fejeződik be, és a kivétel nem lesz kibocsátva. 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.

Ez a módszer akkor ad vissza, ha a várakozás leáll, vagy a fogópontok bármelyikét jelzi, vagy időtúllépés történik. Ha egynél több objektum lesz jelezve a hívás során, a visszatérési érték a jelzett objektum tömbindexe, amely az összes jelzett objektum legkisebb indexértékével van megadva.

A várakozási fogók maximális száma 64, ha az aktuális szál STA állapota 63.

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:

WaitAny(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 bármelyik eleme jelet kap, az időintervallum megadásával és annak megadásával, TimeSpan hogy a várakozás előtt kilépjen-e a szinkronizálási tartományból.

public:
 static int WaitAny(cli::array <System::Threading::WaitHandle ^> ^ waitHandles, TimeSpan timeout, bool exitContext);
public static int WaitAny(System.Threading.WaitHandle[] waitHandles, TimeSpan timeout, bool exitContext);
static member WaitAny : System.Threading.WaitHandle[] * TimeSpan * bool -> int
Public Shared Function WaitAny (waitHandles As WaitHandle(), timeout As TimeSpan, exitContext As Boolean) As Integer

Paraméterek

waitHandles
WaitHandle[]

Olyan WaitHandle tömb, amely azokat az objektumokat tartalmazza, amelyekre az aktuális példány várni fog.

timeout
TimeSpan

Ez TimeSpan a várakozási idő ezredmásodperc, vagy egy TimeSpan olyan érték, amely -1 ezredmásodpercet jelöl 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

Annak az objektumnak a tömbindexe, amely teljesítette a várakozást, vagy WaitTimeout ha egy objektum sem teljesítette a várakozást, és az időintervallum megegyezik a timeout várakozással.

Kivételek

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

-vagy-

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

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

waitHandles elem nélküli tömb, é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 befejeződött, mert egy szál a mutex feloldása nélkül lépett ki.

waitHandles elem nélküli tömb, és a .NET-keretrendszer verziója 2.0-s vagy újabb.

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 használható a szálkészlet egy fájl egyidejű keresésére több lemezen. A hely szempontjából a rendszer csak az egyes lemezek gyökérkönyvtárát keresi.

using System;
using System.IO;
using System.Threading;

class Test
{
    static void Main()
    {
        Search search = new Search();
        search.FindFile("SomeFile.dat");
    }
}

class Search
{
    // Maintain state information to pass to FindCallback.
    class State
    {
        public AutoResetEvent autoEvent;
        public string         fileName;

        public State(AutoResetEvent autoEvent, string fileName)
        {
            this.autoEvent    = autoEvent;
            this.fileName     = fileName;
        }
    }

    AutoResetEvent[] autoEvents;
    String[] diskLetters;

    public Search()
    {
        // Retrieve an array of disk letters.
        diskLetters = Environment.GetLogicalDrives();

        autoEvents = new AutoResetEvent[diskLetters.Length];
        for(int i = 0; i < diskLetters.Length; i++)
        {
            autoEvents[i] = new AutoResetEvent(false);
        }
    }

    // Search for fileName in the root directory of all disks.
    public void FindFile(string fileName)
    {
        for(int i = 0; i < diskLetters.Length; i++)
        {
            Console.WriteLine("Searching for {0} on {1}.",
                fileName, diskLetters[i]);
            ThreadPool.QueueUserWorkItem(
                new WaitCallback(FindCallback), 
                new State(autoEvents[i], diskLetters[i] + fileName));
        }

        // Wait for the first instance of the file to be found.
        int index = WaitHandle.WaitAny(
            autoEvents, new TimeSpan(0, 0, 3), false);
        if(index == WaitHandle.WaitTimeout)
        {
            Console.WriteLine("\n{0} not found.", fileName);
        }
        else
        {
            Console.WriteLine("\n{0} found on {1}.", fileName,
                diskLetters[index]);
        }
    }

    // Search for stateInfo.fileName.
    void FindCallback(object state)
    {
        State stateInfo = (State)state;

        // Signal if the file is found.
        if(File.Exists(stateInfo.fileName))
        {
            stateInfo.autoEvent.Set();
        }
    }
}
Imports System.IO
Imports System.Threading

Public Class Test

    <MTAThread> _
    Shared Sub Main()
        Dim search As New Search()
        search.FindFile("SomeFile.dat")
    End Sub    
End Class

Public Class Search

    ' Maintain state information to pass to FindCallback.
    Class State
        Public autoEvent As AutoResetEvent 
        Public fileName As String         

        Sub New(anEvent As AutoResetEvent, fName As String)
            autoEvent = anEvent
            fileName = fName
        End Sub
    End Class

    Dim autoEvents() As AutoResetEvent
    Dim diskLetters() As String

    Sub New()

        ' Retrieve an array of disk letters.
        diskLetters = Environment.GetLogicalDrives()

        autoEvents = New AutoResetEvent(diskLetters.Length - 1) {}
        For i As Integer = 0 To diskLetters.Length - 1
            autoEvents(i) = New AutoResetEvent(False)
        Next i
    End Sub    
    
    ' Search for fileName in the root directory of all disks.
    Sub FindFile(fileName As String)
        For i As Integer = 0 To diskLetters.Length - 1
            Console.WriteLine("Searching for {0} on {1}.", _
                fileName, diskLetters(i))
        
            ThreadPool.QueueUserWorkItem(AddressOf FindCallback, _ 
                New State(autoEvents(i), diskLetters(i) & fileName))
        Next i

        ' Wait for the first instance of the file to be found.
        Dim index As Integer = WaitHandle.WaitAny( _
            autoEvents, New TimeSpan(0, 0, 3), False)
        If index = WaitHandle.WaitTimeout
            Console.WriteLine(vbCrLf & "{0} not found.", fileName)
        Else
            Console.WriteLine(vbCrLf & "{0} found on {1}.", _
                fileName, diskLetters(index))
        End If
    End Sub

    ' Search for stateInfo.fileName.
    Sub FindCallback(state As Object)
        Dim stateInfo As State = DirectCast(state, State)

        ' Signal if the file is found.
        If File.Exists(stateInfo.fileName) Then
            stateInfo.autoEvent.Set()
        End If
    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.

A WaitAny metódus csak akkor ad ki egy AbandonedMutexException hibát, ha a várakozás befejeződött egy elhagyatott mutex miatt. Ha waitHandles olyan felszabadult mutexet tartalmaz, amely alacsonyabb indexszámmal rendelkezik, mint az elhagyott mutex, a WaitAny metódus a szokásos módon fejeződik be, és a kivétel nem lesz kibocsátva. 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.

Ez a módszer akkor ad vissza, ha a várakozás leáll, vagy a fogópontok bármelyikét jelzi, vagy időtúllépés történik. Ha egynél több objektum lesz jelezve a hívás során, a visszatérési érték a jelzett objektum tömbindexe, amely az összes jelzett objektum legkisebb indexértékével van megadva.

A várakozási fogók maximális száma 64, ha az aktuális szál STA állapota 63.

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: