Auf Englisch lesen

Freigeben über


WaitOrTimerCallback Delegat

Definition

Stellt eine Methode dar, die aufgerufen werden soll, wenn ein Signal an ein WaitHandle gesendet wird oder dessen Timeout überschritten ist.

C#
public delegate void WaitOrTimerCallback(object? state, bool timedOut);
C#
public delegate void WaitOrTimerCallback(object state, bool timedOut);
C#
[System.Runtime.InteropServices.ComVisible(true)]
public delegate void WaitOrTimerCallback(object state, bool timedOut);

Parameter

state
Object

Ein Objekt mit den Informationen, die von der Rückrufmethode bei jeder Ausführung verwendet werden.

timedOut
Boolean

true, wenn das Timeout für WaitHandle überschritten ist, false, wenn ein Signal gesendet wurde.

Attribute

Beispiele

Das folgende Beispiel zeigt, wie Sie mithilfe der WaitOrTimerCallback Stellvertretung eine Rückrufmethode darstellen, die ausgeführt wird, wenn ein Wartepunkt signalisiert wird.

Im Beispiel wird auch gezeigt, wie die RegisterWaitForSingleObject Methode zum Ausführen einer angegebenen Rückrufmethode verwendet wird, wenn ein angegebenes Wartezeitpunkt signalisiert wird. In diesem Beispiel ist WaitProc die Rückrufmethode und der Wait Handle ist ein AutoResetEvent.

Im Beispiel wird eine TaskInfo Klasse definiert, um die Informationen zu enthalten, die beim Ausführen an den Rückruf übergeben werden. Im Beispiel wird ein TaskInfo Objekt erstellt und Zeichenfolgendaten zugewiesen. Die RegisteredWaitHandle von der RegisterWaitForSingleObject Methode zurückgegebene Methode wird dem Handle Feld des TaskInfo Objekts zugewiesen, sodass die Rückrufmethode Zugriff auf das RegisteredWaitHandleObjekt hat.

Zusätzlich zum TaskInfo Objekt gibt der Aufruf der RegisterWaitForSingleObject Methode die Aufgabe an, auf die AutoResetEvent die Aufgabe wartet, eine WaitOrTimerCallback Stellvertretung, die die WaitProc Rückrufmethode, ein ein zweites Timeoutintervall und mehrere Rückrufe darstellt.

Wenn der Hauptthread die AutoResetEvent Methode aufruft Set , wird die WaitOrTimerCallback Stellvertretung aufgerufen. Die WaitProc Methode prüft RegisteredWaitHandle , ob ein Timeout aufgetreten ist. Wenn der Rückruf aufgerufen wurde, weil der Wartepunkt signalisiert wurde, hebt die WaitProc Methode die Registrierung auf RegisteredWaitHandle, beendet weitere Rückrufe. Im Falle eines Timeouts wartet der Vorgang weiterhin. Die WaitProc Methode endet mit dem Drucken einer Nachricht in die Konsole.

C#
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
        );
    }
}

Hinweise

WaitOrTimerCallback stellt eine Rückrufmethode dar, die ausgeführt werden soll, wenn ein registrierter Wartezeitpunkt ausgecheckt oder signalisiert wird. Erstellen Sie die Stellvertretung, indem Sie die Rückrufmethode an den WaitOrTimerCallback Konstruktor übergeben. Ihre Methode muss die hier gezeigte Signatur aufweisen.

Erstellen Sie den registrierten Wartepunkt, indem Sie die WaitOrTimerCallback Stellvertretung und eine an WaitHandle ThreadPool.RegisterWaitForSingleObject. Ihre Rückrufmethode wird jedes Mal ausgeführt, wenn das WaitHandle Timeout oder signalisiert wird.

Hinweis

Visual Basic Benutzer können den WaitOrTimerCallback Konstruktor weglassen und einfach den Operator verwenden, wenn die AddressOf Rückrufmethode an RegisterWaitForSingleObject. Visual Basic ruft automatisch den richtigen Stellvertretungskonstruktor auf.

Wenn Sie Informationen an Ihre Rückrufmethode übergeben möchten, erstellen Sie ein Objekt, das die erforderlichen Informationen enthält, und übergeben Sie sie, RegisterWaitForSingleObject wenn Sie den registrierten Wartepunkt erstellen. Jedes Mal, wenn die Rückrufmethode ausgeführt wird, enthält der state Parameter dieses Objekt.

Weitere Informationen zur Verwendung von Rückrufmethoden zum Synchronisieren von Threadpoolthreads finden Sie im verwalteten Threadpool.

Erweiterungsmethoden

GetMethodInfo(Delegate)

Ruft ein Objekt ab, das die Methode darstellt, die vom angegebenen Delegaten dargestellt wird.

Gilt für

Produkt Versionen
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 2.0, 2.1

Siehe auch