WaitOrTimerCallback Delegált

Definíció

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.

A következőre érvényes:

Lásd még