WaitOrTimerCallback Delegasikan

Definisi

Mewakili metode yang akan dipanggil ketika WaitHandle sinyal atau waktu habis.

public delegate void WaitOrTimerCallback(System::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

Objek yang berisi informasi yang akan digunakan oleh metode panggilan balik setiap kali dijalankan.

timedOut
Boolean

true jika waktu WaitHandle habis; false jika itu disinyalir.

Atribut

Contoh

Contoh berikut menunjukkan cara menggunakan WaitOrTimerCallback delegasi untuk mewakili metode panggilan balik yang dijalankan saat handel tunggu diberi sinyal.

Contoh ini juga menunjukkan cara menggunakan RegisterWaitForSingleObject metode untuk menjalankan metode panggilan balik tertentu ketika handel tunggu yang ditentukan diberi sinyal. Dalam contoh ini, metode panggilan balik adalah WaitProc dan handel tunggu adalah AutoResetEvent.

Contoh mendefinisikan TaskInfo kelas untuk menyimpan informasi yang diteruskan ke panggilan balik saat dijalankan. Contoh membuat TaskInfo objek dan menetapkannya beberapa data string. RegisteredWaitHandle yang dikembalikan oleh RegisterWaitForSingleObject metode ditetapkan ke Handle bidang TaskInfo objek, sehingga metode panggilan balik memiliki akses ke RegisteredWaitHandle.

Selain TaskInfo objek, panggilan ke RegisterWaitForSingleObject metode menentukan AutoResetEvent tugas menunggu, WaitOrTimerCallback delegasi yang mewakili WaitProc metode panggilan balik, interval batas waktu satu detik, dan beberapa panggilan balik.

Ketika utas AutoResetEvent utama memberi sinyal dengan memanggil metodenya Set , WaitOrTimerCallback delegasi dipanggil. Metode ini WaitProc menguji RegisteredWaitHandle untuk menentukan apakah waktu habis terjadi. Jika panggilan balik dipanggil karena handel tunggu diberi sinyal, WaitProc metode membatalkan pendaftaran RegisteredWaitHandle, menghentikan panggilan balik lebih lanjut. Dalam kasus batas waktu, tugas terus menunggu. Metode WaitProc ini berakhir dengan mencetak pesan ke konsol.

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

Keterangan

WaitOrTimerCallback mewakili metode panggilan balik yang ingin Anda jalankan ketika waktu handel tunggu terdaftar habis atau disinyalir. Buat delegasi dengan meneruskan metode panggilan balik Anda ke WaitOrTimerCallback konstruktor. Metode Anda harus memiliki tanda tangan yang ditunjukkan di sini.

Buat handel tunggu terdaftar dengan meneruskan WaitOrTimerCallback delegasi dan WaitHandle ke ThreadPool.RegisterWaitForSingleObject. Metode panggilan balik Anda dijalankan setiap kali waktu WaitHandle habis atau disinyalir.

Note

Pengguna Visual Basic dapat menghilangkan WaitOrTimerCallback konstruktor, dan cukup menggunakan AddressOf operator saat meneruskan metode panggilan balik ke RegisterWaitForSingleObject. Visual Basic secara otomatis memanggil konstruktor delegasi yang benar.

Jika Anda ingin meneruskan informasi ke metode panggilan balik Anda, buat objek yang berisi informasi yang diperlukan dan teruskan ke RegisterWaitForSingleObject saat Anda membuat handel tunggu terdaftar. Setiap kali metode panggilan balik Anda dijalankan, state parameter berisi objek ini.

Untuk informasi selengkapnya tentang menggunakan metode panggilan balik untuk menyinkronkan utas kumpulan utas, lihat Kumpulan utas terkelola.

Metode Ekstensi

Nama Deskripsi
GetMethodInfo(Delegate)

Mendapatkan objek yang mewakili metode yang diwakili oleh delegasi yang ditentukan.

Berlaku untuk

Lihat juga