RegisteredWaitHandle.Unregister(WaitHandle) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Anuluje zarejestrowaną operację oczekiwania wystawioną przez metodę RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) .
public:
bool Unregister(System::Threading::WaitHandle ^ waitObject);
public bool Unregister(System.Threading.WaitHandle? waitObject);
public bool Unregister(System.Threading.WaitHandle waitObject);
[System.Runtime.InteropServices.ComVisible(true)]
public bool Unregister(System.Threading.WaitHandle waitObject);
member this.Unregister : System.Threading.WaitHandle -> bool
[<System.Runtime.InteropServices.ComVisible(true)>]
member this.Unregister : System.Threading.WaitHandle -> bool
Public Function Unregister (waitObject As WaitHandle) As Boolean
Parametry
- waitObject
- WaitHandle
Element WaitHandle do zasygnaliowania.
Zwraca
true jeśli funkcja powiedzie się; w przeciwnym razie, false.
- Atrybuty
Przykłady
W poniższym przykładzie pokazano, jak użyć Unregister metody w celu wyrejestrowania zadania, jeśli wystąpiło wywołanie zwrotne, ponieważ zasygnalizowano uchwyt oczekiwania.
W przykładzie pokazano również, jak za pomocą RegisterWaitForSingleObject metody wykonać określoną metodę wywołania zwrotnego, gdy zostanie zasygnalizowany określony uchwyt oczekiwania. W tym przykładzie metoda wywołania zwrotnego to WaitProc, a uchwyt oczekiwania to AutoResetEvent.
W przykładzie zdefiniowano klasę TaskInfo do przechowywania informacji przekazywanych do wywołania zwrotnego podczas jego wykonywania. W przykładzie zostanie utworzony TaskInfo obiekt i przypisanie do niego pewnych danych ciągów. Obiekt RegisteredWaitHandle zwracany przez RegisterWaitForSingleObject metodę jest przypisywany do Handle pola TaskInfo obiektu, aby metoda wywołania zwrotnego RegisteredWaitHandlemogła uzyskać dostęp do obiektu .
Oprócz określenia TaskInfo jako obiektu, który ma być przekazywany do metody wywołania zwrotnego, wywołanie RegisterWaitForSingleObject metody określa AutoResetEvent , że zadanie będzie czekać, WaitOrTimerCallback delegat, który reprezentuje WaitProc metodę wywołania zwrotnego, jeden drugi interwał limitu czasu i wiele wywołań zwrotnych.
Gdy główny wątek sygnalizuje AutoResetEvent metodę , Set jest wywoływany WaitOrTimerCallback delegat. Metoda WaitProc testuje RegisteredWaitHandle , aby określić, czy wystąpił limit czasu. Jeśli wywołanie zwrotne zostało wywołane, ponieważ obsługa oczekiwania została zasygnalizowana, WaitProc metoda wyrejestrowuje metodę RegisteredWaitHandle, zatrzymując dodatkowe wywołania zwrotne. W przypadku przekroczenia limitu czasu zadanie będzie nadal czekać. Metoda WaitProc kończy się drukowaniem komunikatu w konsoli programu .
using System;
using System.Threading;
// TaskInfo contains data that will be passed to the callback
// method.
public class TaskInfo {
public RegisteredWaitHandle Handle = null;
public string OtherInfo = "default";
}
public class Example {
public static void Main(string[] args) {
// The main thread uses AutoResetEvent to signal the
// registered wait handle, which executes the callback
// method.
AutoResetEvent ev = new AutoResetEvent(false);
TaskInfo ti = new TaskInfo();
ti.OtherInfo = "First task";
// The TaskInfo for the task includes the registered wait
// handle returned by RegisterWaitForSingleObject. This
// allows the wait to be terminated when the object has
// been signaled once (see WaitProc).
ti.Handle = ThreadPool.RegisterWaitForSingleObject(
ev,
new WaitOrTimerCallback(WaitProc),
ti,
1000,
false
);
// The main thread waits three seconds, to demonstrate the
// time-outs on the queued thread, and then signals.
Thread.Sleep(3100);
Console.WriteLine("Main thread signals.");
ev.Set();
// The main thread sleeps, which should give the callback
// method time to execute. If you comment out this line, the
// program usually ends before the ThreadPool thread can execute.
Thread.Sleep(1000);
// If you start a thread yourself, you can wait for it to end
// by calling Thread.Join. This option is not available with
// thread pool threads.
}
// The callback method executes when the registered wait times out,
// or when the WaitHandle (in this case AutoResetEvent) is signaled.
// WaitProc unregisters the WaitHandle the first time the event is
// signaled.
public static void WaitProc(object state, bool timedOut) {
// The state object must be cast to the correct type, because the
// signature of the WaitOrTimerCallback delegate specifies type
// Object.
TaskInfo ti = (TaskInfo) state;
string cause = "TIMED OUT";
if (!timedOut) {
cause = "SIGNALED";
// If the callback method executes because the WaitHandle is
// signaled, stop future execution of the callback method
// by unregistering the WaitHandle.
if (ti.Handle != null)
ti.Handle.Unregister(null);
}
Console.WriteLine("WaitProc( {0} ) executes on thread {1}; cause = {2}.",
ti.OtherInfo,
Thread.CurrentThread.GetHashCode().ToString(),
cause
);
}
}
Imports System.Threading
' TaskInfo contains data that will be passed to the callback
' method.
Public Class TaskInfo
public Handle As RegisteredWaitHandle = Nothing
public OtherInfo As String = "default"
End Class
Public Class Example
<MTAThread> _
Public Shared Sub Main()
' The main thread uses AutoResetEvent to signal the
' registered wait handle, which executes the callback
' method.
Dim ev As New AutoResetEvent(false)
Dim ti As New TaskInfo()
ti.OtherInfo = "First task"
' The TaskInfo for the task includes the registered wait
' handle returned by RegisterWaitForSingleObject. This
' allows the wait to be terminated when the object has
' been signaled once (see WaitProc).
ti.Handle = ThreadPool.RegisterWaitForSingleObject( _
ev, _
New WaitOrTimerCallback(AddressOf WaitProc), _
ti, _
1000, _
false _
)
' The main thread waits about three seconds, to demonstrate
' the time-outs on the queued task, and then signals.
Thread.Sleep(3100)
Console.WriteLine("Main thread signals.")
ev.Set()
' The main thread sleeps, which should give the callback
' method time to execute. If you comment out this line, the
' program usually ends before the ThreadPool thread can execute.
Thread.Sleep(1000)
' If you start a thread yourself, you can wait for it to end
' by calling Thread.Join. This option is not available with
' thread pool threads.
End Sub
' The callback method executes when the registered wait times out,
' or when the WaitHandle (in this case AutoResetEvent) is signaled.
' WaitProc unregisters the WaitHandle the first time the event is
' signaled.
Public Shared Sub WaitProc(state As Object, timedOut As Boolean)
' The state object must be cast to the correct type, because the
' signature of the WaitOrTimerCallback delegate specifies type
' Object.
Dim ti As TaskInfo = CType(state, TaskInfo)
Dim cause As String = "TIMED OUT"
If Not timedOut Then
cause = "SIGNALED"
' If the callback method executes because the WaitHandle is
' signaled, stop future execution of the callback method
' by unregistering the WaitHandle.
If Not ti.Handle Is Nothing Then
ti.Handle.Unregister(Nothing)
End If
End If
Console.WriteLine("WaitProc( {0} ) executes on thread {1}; cause = {2}.", _
ti.OtherInfo, _
Thread.CurrentThread.GetHashCode().ToString(), _
cause _
)
End Sub
End Class
Uwagi
Jeśli waitObject zostanie określony, jest on sygnalizowany tylko wtedy, gdy RegisteredWaitHandle element zostanie pomyślnie wyrejestrowany. Jeśli metoda wywołania zwrotnego jest w toku podczas Unregister wykonywania, waitObject nie jest zasygnalizowana, dopóki metoda wywołania zwrotnego nie zostanie ukończona. W szczególności, jeśli metoda wywołania zwrotnego jest wykonywana Unregister, waitObject nie jest sygnalizowana, dopóki ta metoda wywołania zwrotnego nie zostanie ukończona.