WaitOrTimerCallback Delegera

Definition

Representerar en metod som ska anropas när en WaitHandle signaleras eller överskrider tidsgränsen.

public delegate void WaitOrTimerCallback(System::Object ^ state, bool timedOut);
public delegate void WaitOrTimerCallback(object? state, bool timedOut);
public delegate void WaitOrTimerCallback(object state, bool timedOut);
[System.Runtime.InteropServices.ComVisible(true)]
public delegate void WaitOrTimerCallback(object state, bool timedOut);
type WaitOrTimerCallback = delegate of obj * bool -> unit
[<System.Runtime.InteropServices.ComVisible(true)>]
type WaitOrTimerCallback = delegate of obj * bool -> unit
Public Delegate Sub WaitOrTimerCallback(state As Object, timedOut As Boolean)

Parametrar

state
Object

Ett objekt som innehåller information som ska användas av motringningsmetoden varje gång det körs.

timedOut
Boolean

true om timeouten WaitHandle , false om den signalerades.

Attribut

Exempel

I följande exempel visas hur du använder ombudet WaitOrTimerCallback för att representera en motringningsmetod som körs när ett väntehandtag signaleras.

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 WaitProc återanropsmetoden 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 motringningsmetoden har åtkomst till RegisteredWaitHandle.

Förutom TaskInfo objektet anger RegisterWaitForSingleObject anropet AutoResetEvent till metoden den aktivitet som väntar, ett WaitOrTimerCallback ombud som representerar WaitProc motringningsmetoden, ett timeoutintervall på en sekund och flera motringningar.

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 tidsgräns har inträffat. 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

WaitOrTimerCallback representerar en motringningsmetod som du vill köra när en registrerad väntereferens överskrider tidsgränsen eller signaleras. Skapa ombudet genom att skicka motringningsmetoden till WaitOrTimerCallback konstruktorn. Din metod måste ha signaturen som visas här.

Skapa det registrerade väntehandtaget genom att skicka ombudet WaitOrTimerCallback och till WaitHandleThreadPool.RegisterWaitForSingleObject. Motringningsmetoden körs varje gång tidsgränsen WaitHandle uppnås eller signaleras.

Note

Visual Basic användare kan utelämna konstruktorn WaitOrTimerCallback och helt enkelt använda operatorn AddressOf när de skickar återanropsmetoden till RegisterWaitForSingleObject. Visual Basic anropar automatiskt rätt ombudskonstruktor.

Om du vill skicka information till motringningsmetoden skapar du ett objekt som innehåller nödvändig information och skickar den till RegisterWaitForSingleObject när du skapar det registrerade väntehandtaget. Varje gång motringningsmetoden körs innehåller parametern state det här objektet.

Mer information om hur du använder motringningsmetoder för att synkronisera trådpoolstrådar finns i Den hanterade trådpoolen.

Tilläggsmetoder

Name Description
GetMethodInfo(Delegate)

Hämtar ett objekt som representerar den metod som representeras av det angivna ombudet.

Gäller för

Se även