WaitOrTimerCallback Delegát
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Představuje metodu, která se má volat při signálu nebo vypršení časového limitu WaitHandle .
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)
Parametry
- state
- Object
Objekt obsahující informace, které má metoda zpětného volání používat při každém spuštění.
- timedOut
- Boolean
true
WaitHandle pokud vypršel časový limit; false pokud byl signalován.
- Atributy
Příklady
Následující příklad ukazuje, jak pomocí WaitOrTimerCallback delegáta reprezentovat metodu zpětného volání, která se spustí při volání popisovač je signalován.
Příklad také ukazuje, jak pomocí RegisterWaitForSingleObject metody provést zadanou metodu zpětného volání, když je zadaná obslužná rutina čekání signalována. V tomto příkladu je WaitProc metoda zpětného volání a obslužná rutina čekání je .AutoResetEvent
Příklad definuje TaskInfo třídu pro uložení informací, které se předávají zpětnému volání při jeho spuštění. Příklad vytvoří TaskInfo objekt a přiřadí mu nějaká řetězcová data. Vrácená RegisteredWaitHandle metodou RegisterWaitForSingleObject je přiřazena k Handle poli objektu TaskInfo , aby zpětné volání metoda má přístup k RegisteredWaitHandle.
Kromě objektu TaskInfo určuje volání RegisterWaitForSingleObject metody AutoResetEvent čekání na úkol, WaitOrTimerCallback delegát, který představuje metodu WaitProc zpětného volání, interval časového limitu o jednu sekundu a více zpětných volání.
Když hlavní vlákno signalizuje AutoResetEvent voláním své Set metody, WaitOrTimerCallback delegát je vyvolán. Metoda WaitProc testuje RegisteredWaitHandle , zda došlo k vypršení časového limitu. Pokud bylo vyvoláno zpětné volání, protože obslužná rutina čekání byla signalována, WaitProc metoda zruší registraci RegisteredWaitHandle, zastavení dalších zpětného volání. V případě časového limitu úloha pokračuje v čekání. Metoda WaitProc končí tiskem zprávy do konzoly.
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
Poznámky
WaitOrTimerCallback představuje metodu zpětného volání, kterou chcete provést při vypršení časového limitu registrovaného obslužného rutiny čekání nebo signálu. Vytvořte delegáta předáním metody zpětného volání konstruktoru WaitOrTimerCallback . Vaše metoda musí mít uvedený podpis.
Vytvořte registrovaný popisovač čekání předáním delegáta WaitOrTimerCallback a do WaitHandleThreadPool.RegisterWaitForSingleObject. Vaše metoda zpětného volání se spustí při každém vypršení časového limitu WaitHandle nebo je signalizovat.
Note
Uživatelé jazyka WaitOrTimerCallback Visual Basic mohou vynechat konstruktor a jednoduše použít AddressOf operátor při předání metody zpětného volání do RegisterWaitForSingleObject. Visual Basic automaticky volá správný konstruktor delegáta.
Pokud chcete předat informace do metody zpětného volání, vytvořte objekt obsahující potřebné informace a předejte je RegisterWaitForSingleObject při vytváření registrovaného popisovače čekání. Pokaždé, když se metoda zpětného volání spustí, state parametr obsahuje tento objekt.
Další informace o použití metod zpětného volání k synchronizaci vláken fondu vláken naleznete v tématu Spravovaný fond vláken.
Metody rozšíření
| Name | Description |
|---|---|
| GetMethodInfo(Delegate) |
Získá objekt, který představuje metodu reprezentovanou zadaným delegátem. |