WaitHandle.SignalAndWait Methode

Definition

Signalisiert ein WaitHandle und wartet auf einen anderen.Signals one WaitHandle and waits on another.

Überlädt

SignalAndWait(WaitHandle, WaitHandle)

Signalisiert ein WaitHandle und wartet auf einen anderen.Signals one WaitHandle and waits on another.

SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean)

Signalisiert ein WaitHandle und wartet auf ein weiteres, wobei ein Timeoutintervall als 32-Bit-Ganzzahl mit Vorzeichen angegeben und festgelegt wird, ob die Synchronisierungsdomäne des Kontexts vor dem Wartevorgang verlassen werden soll.Signals one WaitHandle and waits on another, specifying a time-out interval as a 32-bit signed integer and specifying whether to exit the synchronization domain for the context before entering the wait.

SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean)

Signalisiert ein WaitHandle und wartet auf ein weiteres, wobei das Timeoutintervall als TimeSpan angegeben und festgelegt wird, ob die Synchronisierungsdomäne des Kontexts vor dem Wartevorgang verlassen werden soll.Signals one WaitHandle and waits on another, specifying the time-out interval as a TimeSpan and specifying whether to exit the synchronization domain for the context before entering the wait.

SignalAndWait(WaitHandle, WaitHandle)

Signalisiert ein WaitHandle und wartet auf einen anderen.Signals one WaitHandle and waits on another.

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

Parameter

toSignal
WaitHandle

Das zu signalisierende WaitHandle.The WaitHandle to signal.

toWaitOn
WaitHandle

Das WaitHandle, auf das gewartet werden soll.The WaitHandle to wait on.

Gibt zurück

Boolean

true, wenn das Signal und der Wartevorgang erfolgreich abgeschlossen wurden. Wenn der Wartevorgang nicht abgeschlossen wird, wird die Methode nicht beendet.true if both the signal and the wait complete successfully; if the wait does not complete, the method does not return.

Ausnahmen

toSignal ist null.toSignal is null.

- oder --or- toWaitOn ist null.toWaitOn is null.

Die Methode wurde in einem Thread im Status STA aufgerufen.The method was called on a thread in STA state.

toSignal ist ein Semaphor, und die maximale Anzahl ist bereits erreicht.toSignal is a semaphore, and it already has a full count.

Der Wartevorgang wird abgeschlossen, weil ein Thread beendet wurde, ohne ein Mutex freizugeben.The wait completed because a thread exited without releasing a mutex. Diese Ausnahme wird unter Windows 98 oder Windows Millennium Edition nicht ausgelöst.This exception is not thrown on Windows 98 or Windows Millennium Edition.

Beispiele

Im folgenden Codebeispiel wird die- SignalAndWait(WaitHandle, WaitHandle) Methoden Überladung verwendet, damit der Haupt Thread einen blockierten Thread signalisiert und dann wartet, bis der Thread eine Aufgabe abgeschlossen hat.The following code example uses the SignalAndWait(WaitHandle, WaitHandle) method overload to allow the main thread to signal a blocked thread and then wait until the thread finishes a task.

Im Beispiel werden fünf Threads gestartet, sodass Sie für eine blockieren können, EventWaitHandle die mit dem EventResetMode.AutoReset -Flag erstellt wurde, und dann jedes Mal, wenn der Benutzer die EINGABETASTE drückt, einen Thread freigibt.The example starts five threads, allows them to block on an EventWaitHandle created with the EventResetMode.AutoReset flag, and then releases one thread each time the user presses the ENTER key. Im Beispiel werden dann weitere fünf Threads in die Warteschlange eingereiht und EventWaitHandle mit dem mit dem-Flag erstellten freigegeben EventResetMode.ManualReset .The example then queues another five threads and releases them all using an EventWaitHandle created with the EventResetMode.ManualReset flag.

using namespace System;
using namespace System::Threading;

public ref class Example
{
private:
   // The EventWaitHandle used to demonstrate the difference
   // between AutoReset and ManualReset synchronization events.
   //
   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.
   //
   static __int64 threadCount = 0;

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

public:
   [MTAThread]
   static void main()
   {
      // Create an AutoReset EventWaitHandle.
      //
      ewh = gcnew 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 = gcnew Thread(
            gcnew 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( threadCount ) < 5 )
      {
         Thread::Sleep( 500 );
      }

      // Release one thread each time the user presses ENTER,
      // until all threads have been released.
      //
      while ( Interlocked::Read( threadCount ) > 0 )
      {
         Console::WriteLine( L"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 = gcnew EventWaitHandle( false,EventResetMode::ManualReset );
      
      // Create and start five more numbered threads.
      //
      for ( int i = 0; i <= 4; i++ )
      {
         Thread^ t = gcnew Thread(
            gcnew ParameterizedThreadStart( ThreadProc ) );
         t->Start( i );
      }
      
      // Wait until all the threads have started and blocked.
      //
      while ( Interlocked::Read( threadCount ) < 5 )
      {
         Thread::Sleep( 500 );
      }

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

   }

   static void ThreadProc( Object^ data )
   {
      int index = static_cast<Int32>(data);

      Console::WriteLine( L"Thread {0} blocks.", data );
      // Increment the count of blocked threads.
      Interlocked::Increment( threadCount );
      
      // Wait on the EventWaitHandle.
      ewh->WaitOne();

      Console::WriteLine( L"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();
   }
};
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

Hinweise

Es ist nicht garantiert, dass dieser Vorgang atomarisch ist.This operation is not guaranteed to be atomic. Nachdem der aktuelle Thread signalisiert toSignal hat, aber bevor er wartet toWaitOn , könnte ein Thread, der auf einem anderen Prozessor ausgeführt wird, darauf hindeuten toWaitOn oder darauf warten.After the current thread signals toSignal but before it waits on toWaitOn, a thread that is running on another processor might signal toWaitOn or wait on it.

SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean)

Signalisiert ein WaitHandle und wartet auf ein weiteres, wobei ein Timeoutintervall als 32-Bit-Ganzzahl mit Vorzeichen angegeben und festgelegt wird, ob die Synchronisierungsdomäne des Kontexts vor dem Wartevorgang verlassen werden soll.Signals one WaitHandle and waits on another, specifying a time-out interval as a 32-bit signed integer and specifying whether to exit the synchronization domain for the context before entering the wait.

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

Parameter

toSignal
WaitHandle

Das zu signalisierende WaitHandle.The WaitHandle to signal.

toWaitOn
WaitHandle

Das WaitHandle, auf das gewartet werden soll.The WaitHandle to wait on.

millisecondsTimeout
Int32

Eine Ganzzahl, die das Wartezeitintervall darstellt.An integer that represents the interval to wait. Wenn der Wert Infinite (d. h. -1) ist, ist die Wartezeit unendlich.If the value is Infinite, that is, -1, the wait is infinite.

exitContext
Boolean

true, um die Synchronisierungsdomäne für den Kontext vor dem Wartevorgang (sofern in einem synchronisierten Kontext) zu verlassen und diese anschließend erneut abzurufen, andernfalls false.true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it afterward; otherwise, false.

Gibt zurück

Boolean

true, wenn das Signal und die Wartezeit erfolgreich abgeschlossen wurden, oder false, wenn das Signal abgeschlossen wurde, für die Wartezeit jedoch ein Timeout aufgetreten ist.true if both the signal and the wait completed successfully, or false if the signal completed but the wait timed out.

Ausnahmen

toSignal ist null.toSignal is null.

- oder --or- toWaitOn ist null.toWaitOn is null.

Die Methode wird in einem Thread im Status STA aufgerufen.The method is called on a thread in STA state.

Das WaitHandle kann nicht signalisiert werden, da dies die maximale Anzahl übersteigen würde.The WaitHandle cannot be signaled because it would exceed its maximum count.

millisecondsTimeout ist eine negative Zahl, jedoch nicht -1, was einen unbeschränkten Timeout darstellt.millisecondsTimeout is a negative number other than -1, which represents an infinite time-out.

Der Wartevorgang wird abgeschlossen, weil ein Thread beendet wurde, ohne ein Mutex freizugeben.The wait completed because a thread exited without releasing a mutex. Diese Ausnahme wird unter Windows 98 oder Windows Millennium Edition nicht ausgelöst.This exception is not thrown on Windows 98 or Windows Millennium Edition.

Hinweise

Es ist nicht garantiert, dass dieser Vorgang atomarisch ist.This operation is not guaranteed to be atomic. Nachdem der aktuelle Thread signalisiert toSignal hat, aber bevor er wartet toWaitOn , könnte ein Thread, der auf einem anderen Prozessor ausgeführt wird, darauf hindeuten toWaitOn oder darauf warten.After the current thread signals toSignal but before it waits on toWaitOn, a thread that is running on another processor might signal toWaitOn or wait on it.

Wenn millisecondsTimeout 0 (null) ist, wird die-Methode nicht blockiert.If millisecondsTimeout is zero, the method does not block. Er testet den Status von toWaitOn und gibt sofort zurück.It tests the state of the toWaitOn and returns immediately.

Hinweise zum Beenden des KontextsNotes on Exiting the Context

Der- exitContext Parameter hat keine Auswirkung, es sei denn, die- SignalAndWait Methode wird in einem nicht standardmäßigen verwalteten Kontext aufgerufen.The exitContext parameter has no effect unless the SignalAndWait method is called from inside a nondefault managed context. Dies kann vorkommen, wenn sich der Thread innerhalb eines Aufrufes einer Instanz einer von abgeleiteten Klasse befindet ContextBoundObject .This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Auch wenn Sie derzeit eine Methode für eine Klasse ausführen, die nicht von abgeleitet ist ContextBoundObject , String können Sie sich in einem nicht standardmäßigen Kontext befinden, wenn ContextBoundObject sich ein auf dem Stapel in der aktuellen Anwendungsdomäne befindet.Even if you are currently executing a method on a class that does not derive from ContextBoundObject, like String, you can be in a nondefault context if a ContextBoundObject is on your stack in the current application domain.

Wenn Ihr Code in einem nicht standardmäßigen Kontext ausgeführt wird, true bewirkt die Angabe von for, exitContext dass der Thread den nicht standardmäßigen verwalteten Kontext verlässt (d. h., um zum Standardkontext zu wechseln), bevor die-Methode ausgeführt wird SignalAndWait .When your code is executing in a nondefault context, specifying true for exitContext causes the thread to exit the nondefault managed context (that is, to transition to the default context) before executing the SignalAndWait method. Der Thread kehrt in den ursprünglichen nicht standardmäßigen Kontext zurück, nachdem der-Vorgang SignalAndWait abgeschlossen wurde.The thread returns to the original nondefault context after the call to the SignalAndWait method completes.

Dies kann nützlich sein, wenn die Kontext gebundene Klasse über verfügt SynchronizationAttribute .This can be useful when the context-bound class has SynchronizationAttribute. In diesem Fall werden alle Aufrufe an Member der-Klasse automatisch synchronisiert, und die Synchronisierungs Domäne ist der gesamte Code Körper für die-Klasse.In that case, all calls to members of the class are automatically synchronized, and the synchronization domain is the entire body of code for the class. Wenn Code in der Aufruf Stapel eines Members die SignalAndWait -Methode aufruft und true für angibt exitContext , beendet der Thread die Synchronisierungs Domäne, sodass ein Thread, der bei einem Aufruf von einem beliebigen Member des-Objekts blockiert ist, fortgesetzt werden kann.If code in the call stack of a member calls the SignalAndWait method and specifies true for exitContext, the thread exits the synchronization domain, allowing a thread that is blocked on a call to any member of the object to proceed. Wenn die- SignalAndWait Methode zurückgibt, muss der Thread, der den-Befehl erstellt hat, warten, bis die Synchronisierungs Domäne erneut eingegeben wirdWhen the SignalAndWait method returns, the thread that made the call must wait to reenter the synchronization domain.

SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean)

Signalisiert ein WaitHandle und wartet auf ein weiteres, wobei das Timeoutintervall als TimeSpan angegeben und festgelegt wird, ob die Synchronisierungsdomäne des Kontexts vor dem Wartevorgang verlassen werden soll.Signals one WaitHandle and waits on another, specifying the time-out interval as a TimeSpan and specifying whether to exit the synchronization domain for the context before entering the wait.

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

Parameter

toSignal
WaitHandle

Das zu signalisierende WaitHandle.The WaitHandle to signal.

toWaitOn
WaitHandle

Das WaitHandle, auf das gewartet werden soll.The WaitHandle to wait on.

timeout
TimeSpan

Ein TimeSpan-Wert, der das Wartezeitintervall darstellt.A TimeSpan that represents the interval to wait. Wenn der Wert -1 ist, ist die Wartezeit unendlich.If the value is -1, the wait is infinite.

exitContext
Boolean

true, um die Synchronisierungsdomäne für den Kontext vor dem Wartevorgang (sofern in einem synchronisierten Kontext) zu verlassen und diese anschließend erneut abzurufen, andernfalls false.true to exit the synchronization domain for the context before the wait (if in a synchronized context), and reacquire it afterward; otherwise, false.

Gibt zurück

Boolean

true, wenn das Signal und die Wartezeit erfolgreich abgeschlossen wurden, oder false, wenn das Signal abgeschlossen wurde, für die Wartezeit jedoch ein Timeout aufgetreten ist.true if both the signal and the wait completed successfully, or false if the signal completed but the wait timed out.

Ausnahmen

toSignal ist null.toSignal is null.

- oder --or- toWaitOn ist null.toWaitOn is null.

Die Methode wurde in einem Thread im Status STA aufgerufen.The method was called on a thread in STA state.

toSignal ist ein Semaphor, und die maximale Anzahl ist bereits erreicht.toSignal is a semaphore, and it already has a full count.

timeout ergibt eine negative Anzahl von Millisekunden ungleich -1.timeout evaluates to a negative number of milliseconds other than -1.

- oder --or- timeout ist größer als MaxValue.timeout is greater than MaxValue.

Der Wartevorgang wird abgeschlossen, weil ein Thread beendet wurde, ohne ein Mutex freizugeben.The wait completed because a thread exited without releasing a mutex. Diese Ausnahme wird unter Windows 98 oder Windows Millennium Edition nicht ausgelöst.This exception is not thrown on Windows 98 or Windows Millennium Edition.

Hinweise

Es ist nicht garantiert, dass dieser Vorgang atomarisch ist.This operation is not guaranteed to be atomic. Nachdem der aktuelle Thread signalisiert toSignal hat, aber bevor er wartet toWaitOn , könnte ein Thread, der auf einem anderen Prozessor ausgeführt wird, darauf hindeuten toWaitOn oder darauf warten.After the current thread signals toSignal but before it waits on toWaitOn, a thread that is running on another processor might signal toWaitOn or wait on it.

Der Höchstwert für timeout ist Int32.MaxValue .The maximum value for timeout is Int32.MaxValue.

Wenn timeout 0 (null) ist, wird die-Methode nicht blockiert.If timeout is zero, the method does not block. Er testet den Status von toWaitOn und gibt sofort zurück.It tests the state of the toWaitOn and returns immediately.

Hinweise zum Beenden des KontextsNotes on Exiting the Context

Der- exitContext Parameter hat keine Auswirkung, es sei denn, die- SignalAndWait Methode wird in einem nicht standardmäßigen verwalteten Kontext aufgerufen.The exitContext parameter has no effect unless the SignalAndWait method is called from inside a nondefault managed context. Dies kann vorkommen, wenn sich der Thread innerhalb eines Aufrufes einer Instanz einer von abgeleiteten Klasse befindet ContextBoundObject .This can happen if your thread is inside a call to an instance of a class derived from ContextBoundObject. Auch wenn Sie derzeit eine Methode für eine Klasse ausführen, die nicht von abgeleitet ist ContextBoundObject , String können Sie sich in einem nicht standardmäßigen Kontext befinden, wenn ContextBoundObject sich ein auf dem Stapel in der aktuellen Anwendungsdomäne befindet.Even if you are currently executing a method on a class that does not derive from ContextBoundObject, like String, you can be in a nondefault context if a ContextBoundObject is on your stack in the current application domain.

Wenn Ihr Code in einem nicht standardmäßigen Kontext ausgeführt wird, true bewirkt die Angabe von for, exitContext dass der Thread den nicht standardmäßigen verwalteten Kontext verlässt (d. h., um zum Standardkontext zu wechseln), bevor die-Methode ausgeführt wird SignalAndWait .When your code is executing in a nondefault context, specifying true for exitContext causes the thread to exit the nondefault managed context (that is, to transition to the default context) before executing the SignalAndWait method. Der Thread kehrt in den ursprünglichen nicht standardmäßigen Kontext zurück, nachdem der-Vorgang SignalAndWait abgeschlossen wurde.The thread returns to the original nondefault context after the call to the SignalAndWait method completes.

Dies kann nützlich sein, wenn die Kontext gebundene Klasse über verfügt SynchronizationAttribute .This can be useful when the context-bound class has SynchronizationAttribute. In diesem Fall werden alle Aufrufe an Member der-Klasse automatisch synchronisiert, und die Synchronisierungs Domäne ist der gesamte Code Körper für die-Klasse.In that case, all calls to members of the class are automatically synchronized, and the synchronization domain is the entire body of code for the class. Wenn Code in der Aufruf Stapel eines Members die SignalAndWait -Methode aufruft und true für angibt exitContext , beendet der Thread die Synchronisierungs Domäne, sodass ein Thread, der bei einem Aufruf von einem beliebigen Member des-Objekts blockiert ist, fortgesetzt werden kann.If code in the call stack of a member calls the SignalAndWait method and specifies true for exitContext, the thread exits the synchronization domain, allowing a thread that is blocked on a call to any member of the object to proceed. Wenn die- SignalAndWait Methode zurückgibt, muss der Thread, der den-Befehl erstellt hat, warten, bis die Synchronisierungs Domäne erneut eingegeben wirdWhen the SignalAndWait method returns, the thread that made the call must wait to reenter the synchronization domain.

Gilt für: