WaitOrTimerCallback Delegált
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Olyan metódust jelöl, amelyet akkor kell meghívni, ha a rendszer jelzést WaitHandle ad, vagy túllépi az időkorlátot.
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)
Paraméterek
- state
- Object
A visszahívási módszer által használandó információkat tartalmazó objektum minden egyes végrehajtásakor.
- timedOut
- Boolean
true ha az WaitHandle időkorlát túllépte az időkorlátot; false ha jelezték.
- Attribútumok
Példák
Az alábbi példa bemutatja, hogyan használhatja a WaitOrTimerCallback delegáltat egy visszahívási módszer megjelenítésére, amely a várakozási fogópont jelzésekor lesz végrehajtva.
A példa azt is bemutatja, hogyan hajthat RegisterWaitForSingleObject végre egy megadott visszahívási metódust a megadott várakozási fogópont jelzésekor. Ebben a példában a visszahívási módszer, WaitProc a várakozási fogópont pedig egy AutoResetEvent.
A példa meghatároz egy osztályt TaskInfo , amely a visszahívásnak átadott adatokat tárolja a végrehajtáskor. A példa létrehoz egy TaskInfo objektumot, és sztringadatokat rendel hozzá. A RegisteredWaitHandle metódus által visszaadott értéket az RegisterWaitForSingleObjectHandle objektum mezőjéhez TaskInfo rendeli a rendszer, hogy a visszahívási metódus hozzáférhessen a RegisteredWaitHandle.
Az objektum mellett a TaskInfo metódus hívása RegisterWaitForSingleObject megadja a AutoResetEvent várakozó feladatot, a WaitOrTimerCallback visszahívási metódust képviselő WaitProc meghatalmazottat, egy egy másodperces időtúllépési időközt és több visszahívást.
Amikor a fő szál a metódus meghívásával AutoResetEvent jelzi a Set jelet, a WaitOrTimerCallback meghatalmazott meghívása történik. A WaitProc metódustesztek RegisteredWaitHandle annak megállapítására, hogy történt-e időtúllépés. Ha a visszahívás azért lett meghívva, mert a várakozási leírót jelezték, a WaitProc metódus megszünteti a regisztrációt, és leállítja a RegisteredWaitHandletovábbi visszahívásokat. Időtúllépés esetén a feladat továbbra is várakozik. A WaitProc metódus úgy ér véget, hogy egy üzenetet nyomtat a konzolra.
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
Megjegyzések
WaitOrTimerCallback egy visszahívási metódust jelöl, amelyet akkor szeretne végrehajtani, ha egy regisztrált várakozási leíró túllépi az időkorlátot, vagy jelezve van. Hozza létre a meghatalmazottat úgy, hogy átadja a visszahívási módszert a WaitOrTimerCallback konstruktornak. A metódusnak itt kell megjelennie az aláírásnak.
Hozza létre a regisztrált várakozási fogópontot a meghatalmazott és a WaitOrTimerCallbackWaitHandleThreadPool.RegisterWaitForSingleObjectmeghatalmazott átengedésével. A visszahívási módszer minden alkalommal végrehajtja az WaitHandle időtúllépést vagy jelzést.
Note
Visual Basic felhasználók kihagyhatják a WaitOrTimerCallback konstruktort, és egyszerűen használhatják a AddressOf operátort a visszahívási módszer RegisterWaitForSingleObject. Visual Basic automatikusan meghívja a megfelelő delegált konstruktort.
Ha adatokat szeretne átadni a visszahívási metódusnak, hozzon létre egy objektumot, amely tartalmazza a szükséges információkat, és adja át azokat RegisterWaitForSingleObject a regisztrált várakozási leíró létrehozásakor. A visszahívási metódus minden végrehajtásakor a state paraméter tartalmazza ezt az objektumot.
A visszahívási metódusok szálkészlet-szálak szinkronizálására való használatával kapcsolatos további információkért lásd a felügyelt szálkészletet.
Bővítő metódusok
| Name | Description |
|---|---|
| GetMethodInfo(Delegate) |
Lekéri a megadott meghatalmazott által képviselt metódust képviselő objektumot. |