Bagikan melalui


Timer

.NET menyediakan tiga timer untuk digunakan di lingkungan multithreaded:

Catatan

Beberapa implementasi .NET mungkin mencakup timer tambahan:

  • System.Windows.Forms.Timer: sebuah komponen Formulir Windows yang mengaktifkan peristiwa secara berkala. Komponen tersebut tidak memiliki antarmuka pengguna dan dirancang untuk digunakan dalam lingkungan utas tunggal.
  • System.Web.UI.Timer: sebuah komponen ASP.NET yang melakukan postback halaman web asinkron atau sinkron secara berkala.
  • System.Windows.Threading.DispatcherTimer: sebuah timer yang diintegrasikan ke dalam Dispatcher antrean yang diproses pada interval waktu tertentu dan pada prioritas tertentu.

Kelas timer System.Threading.

Kelas System.Threading.Timer ini memungkinkan Anda untuk terus memanggil delegasi pada interval waktu yang ditentukan. Anda juga dapat menggunakan kelas ini untuk menjadwalkan satu panggilan ke delegasi dalam interval waktu tertentu. Delegasi dijalankan pada ThreadPool utas.

Saat Anda membuat System.Threading.Timer objek, Anda menentukan TimerCallback delegasi yang menentukan metode panggilan balik, objek status opsional yang diteruskan ke panggilan balik, jumlah waktu untuk menunda sebelum pemanggilan panggilan balik pertama, dan interval waktu antara pemanggilan panggilan balik. Untuk membatalkan timer yang tertunda, panggil metode Timer.Dispose.

Contoh berikut membuat timer yang memanggil delegasi yang disediakan untuk pertama kalinya setelah satu detik (1000 milidetik) lalu memanggilnya setiap dua detik. Objek status pada contoh digunakan untuk menghitung berapa kali delegasi dipanggil. Timer dihentikan ketika delegasi telah dipanggil setidaknya 10 kali.

using namespace System;
using namespace System::Threading;

ref class TimerState
{
public:
    int counter;
};

ref class Example
{
private:
    static Timer^ timer;

public:
    static void TimerTask(Object^ state)
    {
        Console::WriteLine("{0:HH:mm:ss.fff}: starting a new callback.", DateTime::Now);

        TimerState^ timerState = dynamic_cast<TimerState^>(state);
        Interlocked::Increment(timerState->counter);
    }

    static void Main()
    {
        TimerCallback^ tcb = gcnew TimerCallback(&TimerTask);
        TimerState^ state = gcnew TimerState();
        state->counter = 0;
        timer = gcnew Timer(tcb, state, 1000, 2000);

        while (state->counter <= 10)
        {
            Thread::Sleep(1000);
        }

        timer->~Timer();
        Console::WriteLine("{0:HH:mm:ss.fff}: done.", DateTime::Now);
    }
};

int main()
{
    Example::Main();
}
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    private static Timer timer;

    static void Main(string[] args)
    {
        var timerState = new TimerState { Counter = 0 };

        timer = new Timer(
            callback: new TimerCallback(TimerTask),
            state: timerState,
            dueTime: 1000,
            period: 2000);

        while (timerState.Counter <= 10)
        {
            Task.Delay(1000).Wait();
        }

        timer.Dispose();
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.");
    }

    private static void TimerTask(object timerState)
    {
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.");
        var state = timerState as TimerState;
        Interlocked.Increment(ref state.Counter);
    }

    class TimerState
    {
        public int Counter;
    }
}
Imports System.Threading

Module Program

    Private Timer As Timer

    Sub Main(args As String())

        Dim StateObj As New TimerState
        StateObj.Counter = 0

        Timer = New Timer(New TimerCallback(AddressOf TimerTask), StateObj, 1000, 2000)

        While StateObj.Counter <= 10
            Task.Delay(1000).Wait()
        End While

        Timer.Dispose()
        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.")
    End Sub

    Private Sub TimerTask(ByVal StateObj As Object)

        Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.")

        Dim State As TimerState = CType(StateObj, TimerState)
        Interlocked.Increment(State.Counter)
    End Sub

    Private Class TimerState
        Public Counter As Integer
    End Class
End Module

Untuk informasi dan contoh lebih lengkap, lihat System.Threading.Timer.

Kelas timer System.Timers.

Timer lain yang dapat digunakan di lingkungan multithreaded adalah System.Timers.Timer yang secara default menaikkan peristiwa pada ThreadPool utas.

Saat membuat System.Timers.Timer objek, Anda dapat menentukan interval waktu untuk menaikkan Elapsed peristiwa. Gunakan Enabled properti untuk menunjukkan apakah timer harus menaikkan Elapsed peristiwa. Jika Anda memerlukan peristiwa untuk Elapsed dinaikkan hanya sekali setelah interval yang ditentukan berlalu, atur AutoReset ke false. Nilai AutoReset default properti adalah true, yang berarti bahwa peristiwa Elapsed dinaikkan secara teratur pada interval yang ditentukan oleh Interval properti.

Untuk informasi dan contoh lebih lengkap, lihat System.Timers.Timer.

Kelas System.Threading.PeriodicTimer

Kelas ini System.Threading.PeriodicTimer memungkinkan Anda untuk menunggu tanda centang individual dari interval tertentu, melakukan pekerjaan setelah memanggil PeriodicTimer.WaitForNextTickAsync.

Saat membuat System.Threading.PeriodicTimer objek, Anda menentukan TimeSpan yang menentukan lamanya waktu antara setiap tick timer. Alih-alih meneruskan panggilan balik atau mengatur penanganan aktivitas seperti di kelas timer sebelumnya, Anda melakukan pekerjaan langsung dalam cakupan, menunggu WaitForNextTickAsync untuk memajukan timer dengan interval yang ditentukan.

Metode WaitForNextTickAsync mengembalikan ValueTask<bool>; true setelah berhasil menembakkan timer, dan false ketika timer telah dibatalkan dengan memanggil PeriodicTimer.Dispose. WaitForNextTickAsync secara opsional menerima CancellationToken, yang menghasilkan TaskCanceledException ketika pembatalan telah diminta.

Untuk informasi selengkapnya, lihat System.Threading.PeriodicTimer .

Lihat juga