RegisteredWaitHandle.Unregister(WaitHandle) Methode

Definitie

Hiermee annuleert u een geregistreerde wachtbewerking die is uitgegeven door de RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) methode.

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

Parameters

waitObject
WaitHandle

Het WaitHandle te signaleren.

Retouren

true als de functie slaagt; anders, false.

Kenmerken

Voorbeelden

In het volgende voorbeeld ziet u hoe u de Unregister registratie van een taak ongedaan kunt maken als er een callback is opgetreden omdat de wachtgreep is gesignaleerd.

In het voorbeeld ziet u ook hoe u de RegisterWaitForSingleObject methode gebruikt om een opgegeven callback-methode uit te voeren wanneer een opgegeven wachtgreep wordt gesignaleerd. In dit voorbeeld is WaitProcde callback-methode en is de wachtgreep een AutoResetEvent.

In het voorbeeld wordt een TaskInfo klasse gedefinieerd voor het opslaan van de informatie die wordt doorgegeven aan de callback wanneer deze wordt uitgevoerd. In het voorbeeld wordt een TaskInfo object gemaakt en worden er tekenreeksgegevens aan toegewezen. Het RegisteredWaitHandle resultaat dat door de RegisterWaitForSingleObject methode wordt geretourneerd, wordt toegewezen aan het Handle veld van het TaskInfo object, zodat de callback-methode toegang heeft tot de RegisteredWaitHandle.

Naast het opgeven TaskInfo als het object dat moet worden doorgegeven aan de callback-methode, geeft de aanroep naar de RegisterWaitForSingleObject methode aan AutoResetEvent dat de taak wacht op, een WaitOrTimerCallback gemachtigde die de WaitProc callback-methode vertegenwoordigt, een time-outinterval van één seconde en meerdere callbacks.

Wanneer de hoofdthread de AutoResetEvent methode aanroept Set , wordt de WaitOrTimerCallback gemachtigde aangeroepen. De WaitProc methode test RegisteredWaitHandle om te bepalen of er een time-out is opgetreden. Als de callback is aangeroepen omdat de wachtgreep is gesignaleerd, wordt de WaitProc registratie van de RegisteredWaitHandlemethode ongedaan maken en worden extra callbacks gestopt. In het geval van een time-out blijft de taak wachten. De WaitProc methode eindigt door een bericht naar de console af te drukken.

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

Opmerkingen

Als waitObject dit is opgegeven, wordt deze alleen gesignaleerd als de RegisteredWaitHandle registratie ongedaan is gemaakt. Als er een callback-methode wordt uitgevoerd wanneer Unregister deze wordt uitgevoerd, waitObject wordt er pas een signaal weergegeven als de callback-methode is voltooid. Met name als een callback-methode wordt uitgevoerd Unregister, waitObject wordt pas gesignaleerd als die callback-methode is voltooid.

Van toepassing op

Zie ook