WaitOrTimerCallback Delegat
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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. |