RegisteredWaitHandle.Unregister(WaitHandle) Metod

Definition

Avbryter en registrerad vänteåtgärd som utfärdats av RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) metoden.

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

Parametrar

waitObject
WaitHandle

Som WaitHandle ska signaleras.

Returer

trueom funktionen lyckas; annars . false

Attribut

Exempel

I följande exempel visas hur du använder Unregister metoden för att avregistrera en uppgift om ett återanrop inträffade eftersom väntehandtaget signalerades.

Exemplet visar också hur du använder RegisterWaitForSingleObject metoden för att köra en angiven återanropsmetod när ett angivet väntehandtag signaleras. I det här exemplet är WaitProcmotringningsmetoden , och väntehandtaget är en AutoResetEvent.

Exemplet definierar en TaskInfo klass för att lagra den information som skickas till motringningen när den körs. Exemplet skapar ett TaskInfo objekt och tilldelar det vissa strängdata. Det RegisteredWaitHandle som returneras av RegisterWaitForSingleObject metoden tilldelas till Handle objektets TaskInfo fält så att återanropsmetoden har åtkomst till RegisteredWaitHandle.

Förutom att ange TaskInfo som det objekt som ska skickas till motringningsmetoden anger RegisterWaitForSingleObject anropet AutoResetEvent till metoden att aktiviteten väntar, ett WaitOrTimerCallback ombud som representerar WaitProc motringningsmetoden, ett timeout-intervall på en sekund och flera återanrop.

När huvudtråden signalerar genom att AutoResetEvent anropa dess Set metod anropas ombudet WaitOrTimerCallback . Metoden WaitProc testar RegisteredWaitHandle för att avgöra om en timeout inträffade. Om återanropet anropades på grund av att väntehandtaget signalerades avregistrerar WaitProcRegisteredWaitHandlemetoden och stoppar ytterligare återanrop. Om tidsgränsen överskrids fortsätter aktiviteten att vänta. Metoden WaitProc slutar med att skriva ut ett meddelande till konsolen.

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

Kommentarer

Om waitObject anges signaleras det endast om avregistrerats RegisteredWaitHandle . Om en motringningsmetod pågår när Unregister den körs, signaleras waitObject inte förrän återanropsmetoden har slutförts. I synnerhet, om en motringningsmetod körs , Unregister signaleras waitObjectinte förrän återanropsmetoden har slutförts.

Gäller för

Se även