RegisteredWaitHandle.Unregister(WaitHandle) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Bricht einen von der RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)-Methode ausgegebenen registrierten Wartevorgang ab.
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
Parameter
- waitObject
- WaitHandle
Das WaitHandle, das signalisiert werden soll.
Gibt zurück
true
, wenn die Funktion erfolgreich ausgeführt wird, andernfalls false
.
- Attribute
Beispiele
Im folgenden Beispiel wird gezeigt, wie Die Methode zum Aufheben der Unregister Registrierung einer Aufgabe verwendet wird, wenn ein Rückruf aufgetreten ist, da der Wartenpunkt signalisiert wurde.
Im Beispiel wird auch gezeigt, wie die RegisterWaitForSingleObject Methode zum Ausführen einer angegebenen Rückrufmethode verwendet wird, wenn ein angegebenes Wartenhandpunkt signalisiert wird. In diesem Beispiel ist WaitProc
die Rückrufmethode , und der Wartenpunkt ist ein AutoResetEvent.
Im Beispiel wird eine TaskInfo
Klasse definiert, um die Informationen zu halten, die an den Rückruf übergeben werden, wenn er ausgeführt wird. Das Beispiel erstellt ein TaskInfo
Objekt und weist ihm einige Zeichenfolgendaten zu. Das RegisteredWaitHandle durch die RegisterWaitForSingleObject Methode zurückgegebene Objekt wird dem Handle
Feld des TaskInfo
Objekts zugewiesen, sodass die Rückrufmethode Zugriff auf das RegisteredWaitHandleObjekt hat.
Zusätzlich zum Angeben TaskInfo
des Objekts, das an die Rückrufmethode übergeben werden soll, gibt der Aufruf RegisterWaitForSingleObject an die Methode anAutoResetEvent, dass die Aufgabe warten wird, eine Stellvertretung, die die WaitProc
Rückrufmethode, ein WaitOrTimerCallback zweites Timeoutintervall und mehrere Rückrufe darstellt.
Wenn der Hauptthread die AutoResetEvent Methode aufruft Set , wird der WaitOrTimerCallback Stellvertretung aufgerufen. Die WaitProc
Methode prüft RegisteredWaitHandle , ob ein Timeout aufgetreten ist. Wenn der Rückruf aufgerufen wurde, weil der Wartenhandpunkt signalisiert wurde, wird die WaitProc
Methode die Registrierung RegisteredWaitHandleaufheben, indem zusätzliche Rückrufe beendet werden. Im Falle eines Timeouts wartet die Aufgabe weiterhin. Die WaitProc
Methode endet mit dem Drucken einer Nachricht in die Konsole.
using namespace System;
using namespace System::Threading;
// TaskInfo contains data that will be passed to the callback
// method.
public ref class TaskInfo
{
public:
TaskInfo()
{
Handle = nullptr;
OtherInfo = "default";
}
RegisteredWaitHandle^ Handle;
String^ OtherInfo;
};
ref class Example
{
public:
// 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.
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 = static_cast<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 != nullptr )
ti->Handle->Unregister( nullptr );
}
Console::WriteLine( "WaitProc( {0}) executes on thread {1}; cause = {2}.", ti->OtherInfo, Thread::CurrentThread->GetHashCode(), cause );
}
};
int main()
{
// The main thread uses AutoResetEvent to signal the
// registered wait handle, which executes the callback
// method.
AutoResetEvent^ ev = gcnew AutoResetEvent( false );
TaskInfo^ ti = gcnew 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, gcnew WaitOrTimerCallback( Example::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.
return 0;
}
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
Hinweise
Wenn waitObject
angegeben wird, wird es nur signalisiert, wenn die RegisteredWaitHandle Registrierung erfolgreich aufgehoben wird. Wenn eine Rückrufmethode beim Ausführen ausgeführt wird, wird erst signalisiert, waitObject
wenn Unregister die Rückrufmethode abgeschlossen ist. Insbesondere, wenn eine Rückrufmethode ausgeführt Unregisterwird, wird erst signalisiert, waitObject
wenn diese Rückrufmethode abgeschlossen ist.