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.

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)

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.

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

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

Siehe auch