WaitHandle.SignalAndWait Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Signalerar en WaitHandle och väntar på en annan.
Överlagringar
| Name | Description |
|---|---|
| SignalAndWait(WaitHandle, WaitHandle) |
Signalerar en WaitHandle och väntar på en annan. |
| SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean) |
Signalerar en WaitHandle och väntar på en annan, anger ett tidsgränsintervall som ett 32-bitars signerat heltal och anger om synkroniseringsdomänen ska avslutas för kontexten innan du anger väntetiden. |
| SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean) |
Signalerar en WaitHandle och väntar på en annan, anger tidsgränsintervallet som ett TimeSpan och anger om synkroniseringsdomänen ska avslutas för kontexten innan du anger väntetiden. |
SignalAndWait(WaitHandle, WaitHandle)
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
Signalerar en WaitHandle och väntar på en annan.
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
Parametrar
- toSignal
- WaitHandle
Signalen WaitHandle som ska signaleras.
- toWaitOn
- WaitHandle
Att WaitHandle vänta på.
Returer
true om både signalen och väntan har slutförts. Om väntetiden inte slutförs returnerar metoden inte.
Undantag
Metoden anropades på en tråd i STA tillstånd.
toSignal är en semafor, och den har redan ett fullständigt antal.
Väntan slutfördes eftersom en tråd avslutades utan att en mutex släpptes.
Exempel
I följande kodexempel används metodöverbelastningen SignalAndWait(WaitHandle, WaitHandle) för att låta huvudtråden signalera en blockerad tråd och sedan vänta tills tråden har slutfört en uppgift.
Exemplet startar fem trådar, gör att de kan blockera på en EventWaitHandle som skapats med EventResetMode.AutoReset flaggan och släpper sedan en tråd varje gång användaren trycker på RETUR-tangenten. Exemplet köar sedan ytterligare fem trådar och släpper dem alla med hjälp av en EventWaitHandle skapad med EventResetMode.ManualReset flaggan.
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
Kommentarer
Den här åtgärden är inte garanterad att vara atomisk. Efter den aktuella tråden signalerar toSignal men innan den väntar kan toWaitOnen tråd som körs på en annan processor signalera toWaitOn eller vänta på den.
Gäller för
SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean)
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
Signalerar en WaitHandle och väntar på en annan, anger ett tidsgränsintervall som ett 32-bitars signerat heltal och anger om synkroniseringsdomänen ska avslutas för kontexten innan du anger väntetiden.
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
Parametrar
- toSignal
- WaitHandle
Signalen WaitHandle som ska signaleras.
- toWaitOn
- WaitHandle
Att WaitHandle vänta på.
- millisecondsTimeout
- Int32
Ett heltal som representerar intervallet som ska vänta. Om värdet är Infinite- 1 är väntetiden oändlig.
- exitContext
- Boolean
trueför att avsluta synkroniseringsdomänen för kontexten före väntan (om i en synkroniserad kontext) och återkräv den efteråt. annars . false
Returer
true om både signalen och väntan har slutförts, eller false om signalen har slutförts men väntetiden överskrider tidsgränsen.
Undantag
Metoden anropas på en tråd i STA tillstånd.
Det WaitHandle går inte att signalera eftersom det skulle överskrida det maximala antalet.
millisecondsTimeout är ett annat negativt tal än -1, vilket representerar en oändlig timeout.
Väntan slutfördes eftersom en tråd avslutades utan att en mutex släpptes.
Kommentarer
Den här åtgärden är inte garanterad att vara atomisk. Efter den aktuella tråden signalerar toSignal men innan den väntar kan toWaitOnen tråd som körs på en annan processor signalera toWaitOn eller vänta på den.
Om millisecondsTimeout är noll blockeras inte metoden. Den testar tillståndet för toWaitOn och returnerar omedelbart.
Avsluta kontexten
Parametern exitContext har ingen effekt om inte den här metoden anropas inifrån en nondefault-hanterad kontext. Den hanterade kontexten kan vara nondefault om tråden finns i ett anrop till en instans av en klass som härletts från ContextBoundObject. Även om du för närvarande kör en metod på en klass som inte härleds från ContextBoundObject, till exempel String, kan du vara i en nondefault-kontext om en ContextBoundObject finns på stacken i den aktuella programdomänen.
När koden körs i en nondefault-kontext anger du true för exitContext att tråden ska avsluta den nondefault-hanterade kontexten (dvs. att övergå till standardkontexten) innan den här metoden körs. Tråden återgår till den ursprungliga nondefault-kontexten när anropet till den här metoden har slutförts.
Det kan vara användbart att avsluta kontexten när den kontextbundna klassen har attributet SynchronizationAttribute . I så fall synkroniseras alla anrop till medlemmar i klassen automatiskt och synkroniseringsdomänen är hela kodtexten för klassen. Om kod i anropsstacken för en medlem anropar true den här metoden och anger för exitContextavslutar tråden synkroniseringsdomänen, vilket gör att en tråd som blockeras vid ett anrop till alla medlemmar i objektet kan fortsätta. När den här metoden returneras måste tråden som gjorde anropet vänta tills synkroniseringsdomänen har återaktiviserats.
Gäller för
SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean)
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
- Källa:
- WaitHandle.cs
Signalerar en WaitHandle och väntar på en annan, anger tidsgränsintervallet som ett TimeSpan och anger om synkroniseringsdomänen ska avslutas för kontexten innan du anger väntetiden.
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
Parametrar
- toSignal
- WaitHandle
Signalen WaitHandle som ska signaleras.
- toWaitOn
- WaitHandle
Att WaitHandle vänta på.
- timeout
- TimeSpan
En TimeSpan som representerar intervallet som ska vänta. Om värdet är -1 är väntetiden oändlig.
- exitContext
- Boolean
trueför att avsluta synkroniseringsdomänen för kontexten före väntan (om i en synkroniserad kontext) och återkräv den efteråt. annars . false
Returer
true om både signalen och väntan har slutförts, eller false om signalen har slutförts men väntetiden överskrider tidsgränsen.
Undantag
Metoden anropades på en tråd i STA tillstånd.
toSignal är en semafor, och den har redan ett fullständigt antal.
timeout utvärderas till ett negativt antal millisekunder förutom -1.
-eller-
timeout är större än Int32.MaxValue.
Väntan slutfördes eftersom en tråd avslutades utan att en mutex släpptes.
Kommentarer
Den här åtgärden är inte garanterad att vara atomisk. Efter den aktuella tråden signalerar toSignal men innan den väntar kan toWaitOnen tråd som körs på en annan processor signalera toWaitOn eller vänta på den.
Det maximala värdet för timeout är Int32.MaxValue.
Om timeout är noll blockeras inte metoden. Den testar tillståndet för toWaitOn och returnerar omedelbart.
Avsluta kontexten
Parametern exitContext har ingen effekt om inte den här metoden anropas inifrån en nondefault-hanterad kontext. Den hanterade kontexten kan vara nondefault om tråden finns i ett anrop till en instans av en klass som härletts från ContextBoundObject. Även om du för närvarande kör en metod på en klass som inte härleds från ContextBoundObject, till exempel String, kan du vara i en nondefault-kontext om en ContextBoundObject finns på stacken i den aktuella programdomänen.
När koden körs i en nondefault-kontext anger du true för exitContext att tråden ska avsluta den nondefault-hanterade kontexten (dvs. att övergå till standardkontexten) innan den här metoden körs. Tråden återgår till den ursprungliga nondefault-kontexten när anropet till den här metoden har slutförts.
Det kan vara användbart att avsluta kontexten när den kontextbundna klassen har attributet SynchronizationAttribute . I så fall synkroniseras alla anrop till medlemmar i klassen automatiskt och synkroniseringsdomänen är hela kodtexten för klassen. Om kod i anropsstacken för en medlem anropar true den här metoden och anger för exitContextavslutar tråden synkroniseringsdomänen, vilket gör att en tråd som blockeras vid ett anrop till alla medlemmar i objektet kan fortsätta. När den här metoden returneras måste tråden som gjorde anropet vänta tills synkroniseringsdomänen har återaktiviserats.