Timer Kelas

Definisi

Menyediakan mekanisme untuk menjalankan metode pada utas kumpulan utas pada interval yang ditentukan. Kelas ini tidak dapat diwariskan.

public ref class Timer sealed : IDisposable
public ref class Timer sealed : MarshalByRefObject, IAsyncDisposable, IDisposable
public ref class Timer sealed : MarshalByRefObject, System::Threading::ITimer
public ref class Timer sealed : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : IDisposable
public sealed class Timer : MarshalByRefObject, IAsyncDisposable, IDisposable
public sealed class Timer : MarshalByRefObject, System.Threading.ITimer
public sealed class Timer : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IAsyncDisposable
    interface IDisposable
    interface ITimer
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
Public NotInheritable Class Timer
Implements IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements ITimer
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
Warisan
Timer
Warisan
Atribut
Penerapan

Contoh

Contoh berikut mendefinisikan StatusChecker kelas yang menyertakan CheckStatus metode yang tanda tangannya sama dengan TimerCallback delegasi. Argumen stateCheckStatus metode adalah AutoResetEvent objek yang digunakan untuk menyinkronkan utas aplikasi dan utas kumpulan utas yang menjalankan delegasi panggilan balik. Kelas ini StatusChecker juga mencakup dua variabel status:

invokeCount Menunjukkan berapa kali metode panggilan balik telah dipanggil.

maxCount Menentukan berapa kali metode panggilan balik harus dipanggil.

Utas aplikasi membuat timer, yang menunggu satu detik dan kemudian menjalankan CheckStatus metode panggilan balik setiap 250 milidetik. Utas aplikasi kemudian memblokir hingga AutoResetEvent objek diberi sinyal. CheckStatus Ketika metode panggilan balik mengeksekusi maxCount waktu, metode memanggil AutoResetEvent.Set metode untuk mengatur status objek ke AutoResetEvent sinyal. Pertama kali ini terjadi, utas Change(Int32, Int32) aplikasi memanggil metode sehingga metode panggilan balik sekarang dijalankan setiap setengah detik. Ini sekali lagi memblokir sampai AutoResetEvent objek disinyalir. Ketika ini terjadi, timer dihancurkan dengan memanggil metodenya Dispose , dan aplikasi berakhir.

using namespace System;
using namespace System::Threading;

ref class StatusChecker
{
private:
    int invokeCount, maxCount;

public:
    StatusChecker(int count)
    {
        invokeCount  = 0;
        maxCount = count;
    }

    // This method is called by the timer delegate.
    void CheckStatus(Object^ stateInfo)
    {
        AutoResetEvent^ autoEvent = dynamic_cast<AutoResetEvent^>(stateInfo);
        Console::WriteLine("{0:h:mm:ss.fff} Checking status {1,2}.",
                           DateTime::Now, ++invokeCount);

        if (invokeCount == maxCount) {
            // Reset the counter and signal the waiting thread.
            invokeCount  = 0;
            autoEvent->Set();
        }
    }
};

ref class TimerExample
{
public:
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        AutoResetEvent^ autoEvent = gcnew AutoResetEvent(false);

        StatusChecker^ statusChecker = gcnew StatusChecker(10);

        // Create a delegate that invokes methods for the timer.
        TimerCallback^ tcb =
           gcnew TimerCallback(statusChecker, &StatusChecker::CheckStatus);

        // Create a timer that invokes CheckStatus after one second, 
        // and every 1/4 second thereafter.
        Console::WriteLine("{0:h:mm:ss.fff} Creating timer.\n",
                           DateTime::Now);
        Timer^ stateTimer = gcnew Timer(tcb, autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every half second.
        autoEvent->WaitOne(5000, false);
        stateTimer->Change(0, 500);
        Console::WriteLine("\nChanging period to .5 seconds.\n");

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent->WaitOne(5000, false);
        stateTimer->~Timer();
        Console::WriteLine("\nDestroying timer.");
    }
};

int main()
{
    TimerExample::Main();
}
// The example displays output like the following:
//       11:59:54.202 Creating timer.
//       
//       11:59:55.217 Checking status  1.
//       11:59:55.466 Checking status  2.
//       11:59:55.716 Checking status  3.
//       11:59:55.968 Checking status  4.
//       11:59:56.218 Checking status  5.
//       11:59:56.470 Checking status  6.
//       11:59:56.722 Checking status  7.
//       11:59:56.972 Checking status  8.
//       11:59:57.223 Checking status  9.
//       11:59:57.473 Checking status 10.
//       
//       Changing period to .5 seconds.
//       
//       11:59:57.474 Checking status  1.
//       11:59:57.976 Checking status  2.
//       11:59:58.476 Checking status  3.
//       11:59:58.977 Checking status  4.
//       11:59:59.477 Checking status  5.
//       11:59:59.977 Checking status  6.
//       12:00:00.478 Checking status  7.
//       12:00:00.980 Checking status  8.
//       12:00:01.481 Checking status  9.
//       12:00:01.981 Checking status 10.
//       
//       Destroying timer.
using System;
using System.Threading;

class TimerExample
{
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        var autoEvent = new AutoResetEvent(false);
        
        var statusChecker = new StatusChecker(10);

        // Create a timer that invokes CheckStatus after one second, 
        // and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer.\n", 
                          DateTime.Now);
        var stateTimer = new Timer(statusChecker.CheckStatus, 
                                   autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne();
        stateTimer.Change(0, 500);
        Console.WriteLine("\nChanging period to .5 seconds.\n");

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne();
        stateTimer.Dispose();
        Console.WriteLine("\nDestroying timer.");
    }
}

class StatusChecker
{
    private int invokeCount;
    private int  maxCount;

    public StatusChecker(int count)
    {
        invokeCount  = 0;
        maxCount = count;
    }

    // This method is called by the timer delegate.
    public void CheckStatus(Object stateInfo)
    {
        AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
        Console.WriteLine("{0} Checking status {1,2}.", 
            DateTime.Now.ToString("h:mm:ss.fff"), 
            (++invokeCount).ToString());

        if(invokeCount == maxCount)
        {
            // Reset the counter and signal the waiting thread.
            invokeCount = 0;
            autoEvent.Set();
        }
    }
}
// The example displays output like the following:
//       11:59:54.202 Creating timer.
//       
//       11:59:55.217 Checking status  1.
//       11:59:55.466 Checking status  2.
//       11:59:55.716 Checking status  3.
//       11:59:55.968 Checking status  4.
//       11:59:56.218 Checking status  5.
//       11:59:56.470 Checking status  6.
//       11:59:56.722 Checking status  7.
//       11:59:56.972 Checking status  8.
//       11:59:57.223 Checking status  9.
//       11:59:57.473 Checking status 10.
//       
//       Changing period to .5 seconds.
//       
//       11:59:57.474 Checking status  1.
//       11:59:57.976 Checking status  2.
//       11:59:58.476 Checking status  3.
//       11:59:58.977 Checking status  4.
//       11:59:59.477 Checking status  5.
//       11:59:59.977 Checking status  6.
//       12:00:00.478 Checking status  7.
//       12:00:00.980 Checking status  8.
//       12:00:01.481 Checking status  9.
//       12:00:01.981 Checking status 10.
//       
//       Destroying timer.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Use an AutoResetEvent to signal the timeout threshold in the
        ' timer callback has been reached.
        Dim autoEvent As New AutoResetEvent(False)

        Dim statusChecker As New StatusChecker(10)

        ' Create a timer that invokes CheckStatus after one second, 
        ' and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer." & vbCrLf, 
                          DateTime.Now)
        Dim stateTimer As New Timer(AddressOf statusChecker.CheckStatus, 
                                    autoEvent, 1000, 250)

        ' When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne()
        stateTimer.Change(0, 500)
        Console.WriteLine(vbCrLf & "Changing period to .5 seconds." & vbCrLf)

        ' When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne()
        stateTimer.Dispose()
        Console.WriteLine(vbCrLf & "Destroying timer.")
    End Sub
End Module

Public Class StatusChecker
    Dim invokeCount, maxCount As Integer 

    Sub New(count As Integer)
        invokeCount  = 0
        maxCount = count
    End Sub

    ' The timer callback method.
    Sub CheckStatus(stateInfo As Object)
        Dim autoEvent As AutoResetEvent = DirectCast(stateInfo, AutoResetEvent)
        invokeCount += 1
        Console.WriteLine("{0:h:mm:ss.fff} Checking status {1,2}.", 
                          DateTime.Now, invokeCount)
        If invokeCount = maxCount Then
            ' Reset the counter and signal the waiting thread.
            invokeCount = 0
            autoEvent.Set()
        End If
    End Sub
End Class
' The example displays output like the following:
'       11:59:54.202 Creating timer.
'       
'       11:59:55.217 Checking status  1.
'       11:59:55.466 Checking status  2.
'       11:59:55.716 Checking status  3.
'       11:59:55.968 Checking status  4.
'       11:59:56.218 Checking status  5.
'       11:59:56.470 Checking status  6.
'       11:59:56.722 Checking status  7.
'       11:59:56.972 Checking status  8.
'       11:59:57.223 Checking status  9.
'       11:59:57.473 Checking status 10.
'       
'       Changing period to .5 seconds.
'       
'       11:59:57.474 Checking status  1.
'       11:59:57.976 Checking status  2.
'       11:59:58.476 Checking status  3.
'       11:59:58.977 Checking status  4.
'       11:59:59.477 Checking status  5.
'       11:59:59.977 Checking status  6.
'       12:00:00.478 Checking status  7.
'       12:00:00.980 Checking status  8.
'       12:00:01.481 Checking status  9.
'       12:00:01.981 Checking status 10.
'       
'       Destroying timer.

Keterangan

TimerCallback Gunakan delegasi untuk menentukan metode yang ingin Anda jalankanTimer. Tanda tangan TimerCallback delegasi adalah:

void TimerCallback(Object state)
void TimerCallback(Object state)
Sub TimerCallback(state As Object)

Delegasi timer ditentukan ketika timer dibangun, dan tidak dapat diubah. Metode tidak dijalankan pada utas yang membuat timer; dijalankan pada utas yang ThreadPool disediakan oleh sistem.

Tip

.NET mencakup beberapa kelas timer, yang masing-masing menawarkan fungsionalitas yang berbeda:

  • System.Timers.Timer, yang menembakkan peristiwa dan menjalankan kode dalam satu atau beberapa sink peristiwa secara berkala. Kelas ini dimaksudkan untuk digunakan sebagai komponen berbasis server atau layanan di lingkungan multithreaded; tidak memiliki antarmuka pengguna dan tidak terlihat saat runtime.
  • System.Threading.Timer, yang menjalankan metode panggilan balik tunggal pada utas kumpulan utas secara berkala. Metode panggilan balik ditentukan ketika timer dibuat dan tidak dapat diubah. System.Timers.Timer Seperti kelas , kelas ini dimaksudkan untuk digunakan sebagai komponen berbasis server atau layanan di lingkungan multithreaded; kelas ini tidak memiliki antarmuka pengguna dan tidak terlihat saat runtime.
  • System.Windows.Forms.Timer, komponen Formulir Windows yang mengaktifkan peristiwa dan menjalankan kode dalam satu atau beberapa sink peristiwa secara berkala. Komponen tidak memiliki antarmuka pengguna dan dirancang untuk digunakan dalam lingkungan utas tunggal; dijalankan pada utas UI.
  • System.Web.UI.Timer(hanya .NET Framework), komponen ASP.NET yang melakukan postback halaman web asinkron atau sinkron secara berkala.
  • System.Windows.Threading.DispatcherTimer, timer yang diintegrasikan ke Dispatcher dalam antrean. Timer ini diproses dengan prioritas tertentu pada interval waktu tertentu.

Saat membuat timer, Anda dapat menentukan jumlah waktu untuk menunggu sebelum eksekusi pertama metode (waktu jatuh tempo), dan jumlah waktu untuk menunggu antara eksekusi berikutnya (periode). Kelas Timer memiliki resolusi yang sama dengan jam sistem. Ini berarti bahwa jika periode kurang dari resolusi jam sistem, TimerCallback delegasi akan mengeksekusi pada interval yang ditentukan oleh resolusi jam sistem, yaitu sekitar 15 milidetik pada sistem Windows 7 dan Windows 8. Anda dapat mengubah waktu dan periode jatuh tempo, atau menonaktifkan timer, dengan menggunakan Change metode .

Catatan

Selama Anda menggunakan Timer, Anda harus menyimpan referensi ke dalamnya. Seperti halnya objek terkelola, tunduk Timer pada pengumpulan sampah ketika tidak ada referensi untuk itu. Fakta bahwa masih Timer aktif tidak mencegahnya dikumpulkan.

Catatan

Jam sistem yang digunakan adalah jam yang sama yang digunakan oleh GetTickCount, yang tidak terpengaruh oleh perubahan yang dibuat dengan timeBeginPeriod dan timeEndPeriod.

Ketika timer tidak lagi diperlukan, gunakan Dispose metode untuk membebaskan sumber daya yang dipegang oleh timer. Perhatikan bahwa panggilan balik dapat terjadi setelah Dispose() metode kelebihan beban dipanggil, karena timer mengantrekan panggilan balik untuk eksekusi oleh utas kumpulan utas. Anda dapat menggunakan metode kelebihan Dispose(WaitHandle) beban untuk menunggu hingga semua panggilan balik selesai.

Metode panggilan balik yang dijalankan oleh timer harus masuk kembali, karena dipanggil pada ThreadPool utas. Panggilan balik dapat dijalankan secara bersamaan pada dua utas kumpulan utas jika interval timer kurang dari waktu yang diperlukan untuk menjalankan panggilan balik, atau jika semua utas kumpulan utas sedang digunakan dan panggilan balik diantrekan beberapa kali.

Catatan

System.Threading.Timer adalah timer sederhana dan ringan yang menggunakan metode panggilan balik dan dilayani oleh utas kumpulan utas. Tidak disarankan untuk digunakan dengan Formulir Windows, karena panggilan baliknya tidak terjadi pada utas antarmuka pengguna. System.Windows.Forms.Timeradalah pilihan yang lebih baik untuk digunakan dengan Formulir Windows. Untuk fungsionalitas timer berbasis server, Anda mungkin mempertimbangkan untuk menggunakan System.Timers.Timer, yang meningkatkan peristiwa dan memiliki fitur tambahan.

Konstruktor

Timer(TimerCallback)

Menginisialisasi instans Timer baru kelas dengan periode tak terbatas dan waktu jatuh tempo tak terbatas, menggunakan objek yang baru dibuat Timer sebagai objek status.

Timer(TimerCallback, Object, Int32, Int32)

Menginisialisasi instans baru kelas, menggunakan bilangan Timer bulat bertanda tangan 32-bit untuk menentukan interval waktu.

Timer(TimerCallback, Object, Int64, Int64)

Menginisialisasi instans baru kelas, menggunakan bilangan Timer bulat bertanda tangan 64-bit untuk mengukur interval waktu.

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

Menginisialisasi instans Timer baru kelas, menggunakan TimeSpan nilai untuk mengukur interval waktu.

Timer(TimerCallback, Object, UInt32, UInt32)

Menginisialisasi instans baru kelas, menggunakan bilangan Timer bulat yang tidak ditandatangani 32-bit untuk mengukur interval waktu.

Properti

ActiveCount

Mendapatkan jumlah timer yang saat ini aktif. Timer aktif didaftarkan untuk dicentang di beberapa titik di masa mendatang, dan belum dibatalkan.

Metode

Change(Int32, Int32)

Mengubah waktu mulai dan interval antara pemanggilan metode untuk timer, menggunakan bilangan bulat bertanda 32-bit untuk mengukur interval waktu.

Change(Int64, Int64)

Mengubah waktu mulai dan interval antara pemanggilan metode untuk timer, menggunakan bilangan bulat bertanda 64-bit untuk mengukur interval waktu.

Change(TimeSpan, TimeSpan)

Mengubah waktu mulai dan interval antara pemanggilan metode untuk timer, menggunakan TimeSpan nilai untuk mengukur interval waktu.

Change(UInt32, UInt32)

Mengubah waktu mulai dan interval antara pemanggilan metode untuk timer, menggunakan bilangan bulat yang tidak ditandatangani 32-bit untuk mengukur interval waktu.

CreateObjRef(Type)

Membuat objek yang berisi semua informasi relevan yang diperlukan untuk menghasilkan proksi yang digunakan untuk berkomunikasi dengan objek jarak jauh.

(Diperoleh dari MarshalByRefObject)
Dispose()

Merilis semua sumber daya yang digunakan oleh instans saat ini dari Timer.

Dispose(WaitHandle)

Merilis semua sumber daya yang digunakan oleh instans Timer dan sinyal saat ini ketika timer telah dibuang.

DisposeAsync()

Merilis semua sumber daya yang digunakan oleh instans saat ini dari Timer.

Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
Finalize()

Memungkinkan objek untuk mencoba membebaskan sumber daya dan melakukan operasi pembersihan lainnya sebelum direklamasi kembali oleh pengumpulan sampah.

GetHashCode()

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetLifetimeService()
Kedaluwarsa.

Mengambil objek layanan seumur hidup saat ini yang mengontrol kebijakan seumur hidup untuk instans ini.

(Diperoleh dari MarshalByRefObject)
GetType()

Mendapatkan instans Type saat ini.

(Diperoleh dari Object)
InitializeLifetimeService()
Kedaluwarsa.

Mendapatkan objek layanan seumur hidup untuk mengontrol kebijakan seumur hidup untuk instans ini.

(Diperoleh dari MarshalByRefObject)
MemberwiseClone()

Membuat salinan dangkal dari yang saat ini Object.

(Diperoleh dari Object)
MemberwiseClone(Boolean)

Membuat salinan dangkal objek saat ini MarshalByRefObject .

(Diperoleh dari MarshalByRefObject)
ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Metode Ekstensi

ConfigureAwait(IAsyncDisposable, Boolean)

Mengonfigurasi bagaimana menunggu tugas yang dikembalikan dari asinkron sekali pakai dilakukan.

Berlaku untuk

Keamanan Thread

Jenis ini aman untuk utas.

Lihat juga