WaitHandle.SignalAndWait Methode

Definitie

Signaleert de WaitHandle ene en wacht op een andere.

Overloads

Name Description
SignalAndWait(WaitHandle, WaitHandle)

Signaleert de WaitHandle ene en wacht op een andere.

SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean)

WaitHandle Signaleert een en wacht op een ander, waarbij een time-outinterval wordt opgegeven als een 32-bits geheel getal dat is ondertekend en wordt opgegeven of het synchronisatiedomein voor de context moet worden afgesloten voordat de wacht wordt ingevoerd.

SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean)

WaitHandle Signalen een en wachten op een andere, waarbij het time-outinterval wordt opgegeven als een TimeSpan en opgeven of het synchronisatiedomein voor de context moet worden afgesloten voordat u de wacht invoert.

SignalAndWait(WaitHandle, WaitHandle)

Signaleert de WaitHandle ene en wacht op een andere.

public:
 static bool SignalAndWait(System::Threading::WaitHandle ^ toSignal, System::Threading::WaitHandle ^ toWaitOn);
public static bool SignalAndWait(System.Threading.WaitHandle toSignal, System.Threading.WaitHandle toWaitOn);
static member SignalAndWait : System.Threading.WaitHandle * System.Threading.WaitHandle -> bool
Public Shared Function SignalAndWait (toSignal As WaitHandle, toWaitOn As WaitHandle) As Boolean

Parameters

toSignal
WaitHandle

Het WaitHandle te signaleren.

toWaitOn
WaitHandle

De WaitHandle wacht op.

Retouren

true indien zowel het signaal als de wachttijd is voltooid; als de wachttijd niet is voltooid, retourneert de methode niet.

Uitzonderingen

toSignal is null.

– of –

toWaitOn is null.

De methode is aangeroepen op een thread met STA de status.

toSignal is een semafore en het heeft al een volledige telling.

De wachttijd is voltooid omdat een thread is afgesloten zonder een mutex vrij te geven.

Voorbeelden

In het volgende codevoorbeeld wordt de overbelasting van de SignalAndWait(WaitHandle, WaitHandle) methode gebruikt om de hoofdthread een geblokkeerde thread te laten signaleren en vervolgens te wachten totdat de thread een taak heeft voltooid.

In het voorbeeld worden vijf threads gestart, kunnen ze blokkeren op een EventWaitHandle gemaakt met de EventResetMode.AutoReset vlag en wordt vervolgens één thread uitgebracht telkens wanneer de gebruiker op de Enter-toets drukt. In het voorbeeld worden vervolgens nog vijf threads in de wachtrij geplaatst en worden ze allemaal vrijgegeven met behulp van een EventWaitHandle gemaakt met de EventResetMode.ManualReset vlag.

using System;
using System.Threading;

public class Example
{
    // The EventWaitHandle used to demonstrate the difference
    // between AutoReset and ManualReset synchronization events.
    //
    private static EventWaitHandle ewh;

    // A counter to make sure all threads are started and
    // blocked before any are released. A Long is used to show
    // the use of the 64-bit Interlocked methods.
    //
    private static long threadCount = 0;

    // An AutoReset event that allows the main thread to block
    // until an exiting thread has decremented the count.
    //
    private static EventWaitHandle clearCount = 
        new EventWaitHandle(false, EventResetMode.AutoReset);

    [MTAThread]
    public static void Main()
    {
        // Create an AutoReset EventWaitHandle.
        //
        ewh = new EventWaitHandle(false, EventResetMode.AutoReset);

        // Create and start five numbered threads. Use the
        // ParameterizedThreadStart delegate, so the thread
        // number can be passed as an argument to the Start 
        // method.
        for (int i = 0; i <= 4; i++)
        {
            Thread t = new Thread(
                new ParameterizedThreadStart(ThreadProc)
            );
            t.Start(i);
        }

        // Wait until all the threads have started and blocked.
        // When multiple threads use a 64-bit value on a 32-bit
        // system, you must access the value through the
        // Interlocked class to guarantee thread safety.
        //
        while (Interlocked.Read(ref threadCount) < 5)
        {
            Thread.Sleep(500);
        }

        // Release one thread each time the user presses ENTER,
        // until all threads have been released.
        //
        while (Interlocked.Read(ref threadCount) > 0)
        {
            Console.WriteLine("Press ENTER to release a waiting thread.");
            Console.ReadLine();

            // SignalAndWait signals the EventWaitHandle, which
            // releases exactly one thread before resetting, 
            // because it was created with AutoReset mode. 
            // SignalAndWait then blocks on clearCount, to 
            // allow the signaled thread to decrement the count
            // before looping again.
            //
            WaitHandle.SignalAndWait(ewh, clearCount);
        }
        Console.WriteLine();

        // Create a ManualReset EventWaitHandle.
        //
        ewh = new EventWaitHandle(false, EventResetMode.ManualReset);

        // Create and start five more numbered threads.
        //
        for(int i=0; i<=4; i++)
        {
            Thread t = new Thread(
                new ParameterizedThreadStart(ThreadProc)
            );
            t.Start(i);
        }

        // Wait until all the threads have started and blocked.
        //
        while (Interlocked.Read(ref threadCount) < 5)
        {
            Thread.Sleep(500);
        }

        // Because the EventWaitHandle was created with
        // ManualReset mode, signaling it releases all the
        // waiting threads.
        //
        Console.WriteLine("Press ENTER to release the waiting threads.");
        Console.ReadLine();
        ewh.Set();
    }

    public static void ThreadProc(object data)
    {
        int index = (int) data;

        Console.WriteLine("Thread {0} blocks.", data);
        // Increment the count of blocked threads.
        Interlocked.Increment(ref threadCount);

        // Wait on the EventWaitHandle.
        ewh.WaitOne();

        Console.WriteLine("Thread {0} exits.", data);
        // Decrement the count of blocked threads.
        Interlocked.Decrement(ref threadCount);

        // After signaling ewh, the main thread blocks on
        // clearCount until the signaled thread has 
        // decremented the count. Signal it now.
        //
        clearCount.Set();
    }
}
Imports System.Threading

Public Class Example

    ' The EventWaitHandle used to demonstrate the difference
    ' between AutoReset and ManualReset synchronization events.
    '
    Private Shared ewh As EventWaitHandle

    ' A counter to make sure all threads are started and
    ' blocked before any are released. A Long is used to show
    ' the use of the 64-bit Interlocked methods.
    '
    Private Shared threadCount As Long = 0

    ' An AutoReset event that allows the main thread to block
    ' until an exiting thread has decremented the count.
    '
    Private Shared clearCount As New EventWaitHandle(False, _
        EventResetMode.AutoReset)

    <MTAThread> _
    Public Shared Sub Main()

        ' Create an AutoReset EventWaitHandle.
        '
        ewh = New EventWaitHandle(False, EventResetMode.AutoReset)

        ' Create and start five numbered threads. Use the
        ' ParameterizedThreadStart delegate, so the thread
        ' number can be passed as an argument to the Start 
        ' method.
        For i As Integer = 0 To 4
            Dim t As New Thread(AddressOf ThreadProc)
            t.Start(i)
        Next i

        ' Wait until all the threads have started and blocked.
        ' When multiple threads use a 64-bit value on a 32-bit
        ' system, you must access the value through the
        ' Interlocked class to guarantee thread safety.
        '
        While Interlocked.Read(threadCount) < 5
            Thread.Sleep(500)
        End While

        ' Release one thread each time the user presses ENTER,
        ' until all threads have been released.
        '
        While Interlocked.Read(threadCount) > 0
            Console.WriteLine("Press ENTER to release a waiting thread.")
            Console.ReadLine()

            ' SignalAndWait signals the EventWaitHandle, which
            ' releases exactly one thread before resetting, 
            ' because it was created with AutoReset mode. 
            ' SignalAndWait then blocks on clearCount, to 
            ' allow the signaled thread to decrement the count
            ' before looping again.
            '
            WaitHandle.SignalAndWait(ewh, clearCount)
        End While
        Console.WriteLine()

        ' Create a ManualReset EventWaitHandle.
        '
        ewh = New EventWaitHandle(False, EventResetMode.ManualReset)

        ' Create and start five more numbered threads.
        '
        For i As Integer = 0 To 4
            Dim t As New Thread(AddressOf ThreadProc)
            t.Start(i)
        Next i

        ' Wait until all the threads have started and blocked.
        '
        While Interlocked.Read(threadCount) < 5
            Thread.Sleep(500)
        End While

        ' Because the EventWaitHandle was created with
        ' ManualReset mode, signaling it releases all the
        ' waiting threads.
        '
        Console.WriteLine("Press ENTER to release the waiting threads.")
        Console.ReadLine()
        ewh.Set()
        
    End Sub

    Public Shared Sub ThreadProc(ByVal data As Object)
        Dim index As Integer = CInt(data)

        Console.WriteLine("Thread {0} blocks.", data)
        ' Increment the count of blocked threads.
        Interlocked.Increment(threadCount)

        ' Wait on the EventWaitHandle.
        ewh.WaitOne()

        Console.WriteLine("Thread {0} exits.", data)
        ' Decrement the count of blocked threads.
        Interlocked.Decrement(threadCount)

        ' After signaling ewh, the main thread blocks on
        ' clearCount until the signaled thread has 
        ' decremented the count. Signal it now.
        '
        clearCount.Set()
    End Sub
End Class

Opmerkingen

Deze bewerking is niet gegarandeerd atomisch. Na de huidige threadsignalen toSignal , maar voordat deze wacht toWaitOn, kan een thread die op een andere processor wordt uitgevoerd, signaleren toWaitOn of erop wachten.

Van toepassing op

SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean)

WaitHandle Signaleert een en wacht op een ander, waarbij een time-outinterval wordt opgegeven als een 32-bits geheel getal dat is ondertekend en wordt opgegeven of het synchronisatiedomein voor de context moet worden afgesloten voordat de wacht wordt ingevoerd.

public:
 static bool SignalAndWait(System::Threading::WaitHandle ^ toSignal, System::Threading::WaitHandle ^ toWaitOn, int millisecondsTimeout, bool exitContext);
public static bool SignalAndWait(System.Threading.WaitHandle toSignal, System.Threading.WaitHandle toWaitOn, int millisecondsTimeout, bool exitContext);
static member SignalAndWait : System.Threading.WaitHandle * System.Threading.WaitHandle * int * bool -> bool
Public Shared Function SignalAndWait (toSignal As WaitHandle, toWaitOn As WaitHandle, millisecondsTimeout As Integer, exitContext As Boolean) As Boolean

Parameters

toSignal
WaitHandle

Het WaitHandle te signaleren.

toWaitOn
WaitHandle

De WaitHandle wacht op.

millisecondsTimeout
Int32

Een geheel getal dat het interval aangeeft dat moet worden gewacht. Als de waarde is Infinite, is -1, de wachttijd oneindig.

exitContext
Boolean

true om het synchronisatiedomein voor de context vóór de wachttijd af te sluiten (indien in een gesynchroniseerde context) en het daarna opnieuw te vragen; anders, false.

Retouren

true als zowel het signaal als de wachttijd is voltooid, of false als het signaal is voltooid, maar de wachttijd is verlopen.

Uitzonderingen

toSignal is null.

– of –

toWaitOn is null.

De methode wordt aangeroepen op een thread met STA de status.

Het WaitHandle kan niet worden gesignaleerd omdat deze het maximumaantal overschrijdt.

millisecondsTimeout is een ander negatief getal dan -1, dat een oneindige time-out vertegenwoordigt.

De wachttijd is voltooid omdat een thread is afgesloten zonder een mutex vrij te geven.

Opmerkingen

Deze bewerking is niet gegarandeerd atomisch. Na de huidige threadsignalen toSignal , maar voordat deze wacht toWaitOn, kan een thread die op een andere processor wordt uitgevoerd, signaleren toWaitOn of erop wachten.

Als millisecondsTimeout nul is, wordt de methode niet geblokkeerd. Hiermee wordt de status van de toWaitOn test getest en onmiddellijk geretourneerd.

De context afsluiten

De exitContext parameter heeft geen effect, tenzij deze methode wordt aangeroepen vanuit een niet-standaard beheerde context. De beheerde context kan niet-standaard zijn als uw thread zich in een aanroep bevindt naar een exemplaar van een klasse die is afgeleid van ContextBoundObject. Zelfs als u momenteel een methode uitvoert op een klasse die niet is afgeleid van ContextBoundObject, zoals String, kunt u zich in een niet-standaardcontext bevinden als een ContextBoundObject is op uw stack in het huidige toepassingsdomein.

Wanneer uw code wordt uitgevoerd in een niet-standaardcontext, geeft trueexitContext u aan dat de thread de niet-standaard beheerde context verlaat (dat wil gezegd, om over te stappen op de standaardcontext) voordat deze methode wordt uitgevoerd. De thread keert terug naar de oorspronkelijke niet-standaardcontext nadat de aanroep van deze methode is voltooid.

Het afsluiten van de context kan handig zijn wanneer de contextgebonden klasse het SynchronizationAttribute kenmerk heeft. In dat geval worden alle aanroepen naar leden van de klasse automatisch gesynchroniseerd en is het synchronisatiedomein de volledige hoofdtekst van de code voor de klasse. Als code in de aanroepstack van een lid deze methode aanroept en opgeeft trueexitContext, sluit de thread het synchronisatiedomein af, waardoor een thread die wordt geblokkeerd voor een aanroep naar een lid van het object, wordt voortgezet. Wanneer deze methode wordt geretourneerd, moet de thread die de aanroep heeft gedaan wachten om het synchronisatiedomein opnieuw in te voeren.

Van toepassing op

SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean)

WaitHandle Signalen een en wachten op een andere, waarbij het time-outinterval wordt opgegeven als een TimeSpan en opgeven of het synchronisatiedomein voor de context moet worden afgesloten voordat u de wacht invoert.

public:
 static bool SignalAndWait(System::Threading::WaitHandle ^ toSignal, System::Threading::WaitHandle ^ toWaitOn, TimeSpan timeout, bool exitContext);
public static bool SignalAndWait(System.Threading.WaitHandle toSignal, System.Threading.WaitHandle toWaitOn, TimeSpan timeout, bool exitContext);
static member SignalAndWait : System.Threading.WaitHandle * System.Threading.WaitHandle * TimeSpan * bool -> bool
Public Shared Function SignalAndWait (toSignal As WaitHandle, toWaitOn As WaitHandle, timeout As TimeSpan, exitContext As Boolean) As Boolean

Parameters

toSignal
WaitHandle

Het WaitHandle te signaleren.

toWaitOn
WaitHandle

De WaitHandle wacht op.

timeout
TimeSpan

Een TimeSpan die het interval aangeeft dat moet worden gewacht. Als de waarde -1 is, is de wachttijd oneindig.

exitContext
Boolean

true om het synchronisatiedomein voor de context vóór de wachttijd af te sluiten (indien in een gesynchroniseerde context) en het daarna opnieuw te vragen; anders, false.

Retouren

true als zowel het signaal als de wachttijd is voltooid, of false als het signaal is voltooid, maar de wachttijd is verlopen.

Uitzonderingen

toSignal is null.

– of –

toWaitOn is null.

De methode is aangeroepen op een thread met STA de status.

toSignal is een semafore en het heeft al een volledige telling.

timeout resulteert in een negatief aantal milliseconden anders dan -1.

– of –

timeout is groter dan Int32.MaxValue.

De wachttijd is voltooid omdat een thread is afgesloten zonder een mutex vrij te geven.

Opmerkingen

Deze bewerking is niet gegarandeerd atomisch. Na de huidige threadsignalen toSignal , maar voordat deze wacht toWaitOn, kan een thread die op een andere processor wordt uitgevoerd, signaleren toWaitOn of erop wachten.

De maximumwaarde voor timeout is Int32.MaxValue.

Als timeout nul is, wordt de methode niet geblokkeerd. Hiermee wordt de status van de toWaitOn test getest en onmiddellijk geretourneerd.

De context afsluiten

De exitContext parameter heeft geen effect, tenzij deze methode wordt aangeroepen vanuit een niet-standaard beheerde context. De beheerde context kan niet-standaard zijn als uw thread zich in een aanroep bevindt naar een exemplaar van een klasse die is afgeleid van ContextBoundObject. Zelfs als u momenteel een methode uitvoert op een klasse die niet is afgeleid van ContextBoundObject, zoals String, kunt u zich in een niet-standaardcontext bevinden als een ContextBoundObject is op uw stack in het huidige toepassingsdomein.

Wanneer uw code wordt uitgevoerd in een niet-standaardcontext, geeft trueexitContext u aan dat de thread de niet-standaard beheerde context verlaat (dat wil gezegd, om over te stappen op de standaardcontext) voordat deze methode wordt uitgevoerd. De thread keert terug naar de oorspronkelijke niet-standaardcontext nadat de aanroep van deze methode is voltooid.

Het afsluiten van de context kan handig zijn wanneer de contextgebonden klasse het SynchronizationAttribute kenmerk heeft. In dat geval worden alle aanroepen naar leden van de klasse automatisch gesynchroniseerd en is het synchronisatiedomein de volledige hoofdtekst van de code voor de klasse. Als code in de aanroepstack van een lid deze methode aanroept en opgeeft trueexitContext, sluit de thread het synchronisatiedomein af, waardoor een thread die wordt geblokkeerd voor een aanroep naar een lid van het object, wordt voortgezet. Wanneer deze methode wordt geretourneerd, moet de thread die de aanroep heeft gedaan wachten om het synchronisatiedomein opnieuw in te voeren.

Van toepassing op