Bagikan melalui


Timer Kelas

Definisi

Menghasilkan peristiwa setelah interval yang ditetapkan, dengan opsi untuk menghasilkan peristiwa berulang.

public ref class Timer : System::ComponentModel::Component, System::ComponentModel::ISupportInitialize
public class Timer : System.ComponentModel.Component, System.ComponentModel.ISupportInitialize
type Timer = class
    inherit Component
    interface ISupportInitialize
Public Class Timer
Inherits Component
Implements ISupportInitialize
Warisan
Penerapan

Contoh

Contoh berikut membuat System.Timers.Timer instans objek yang menembakkan peristiwanya Timer.Elapsed setiap dua detik (2.000 milidetik), menyiapkan penanganan aktivitas untuk peristiwa, dan memulai timer. Penanganan aktivitas menampilkan nilai ElapsedEventArgs.SignalTime properti setiap kali dinaikkan.

using System;
using System.Timers;

public class Example
{
   private static System.Timers.Timer aTimer;
   
   public static void Main()
   {
      SetTimer();

      Console.WriteLine("\nPress the Enter key to exit the application...\n");
      Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now);
      Console.ReadLine();
      aTimer.Stop();
      aTimer.Dispose();
      
      Console.WriteLine("Terminating the application...");
   }

   private static void SetTimer()
   {
        // Create a timer with a two second interval.
        aTimer = new System.Timers.Timer(2000);
        // Hook up the Elapsed event for the timer. 
        aTimer.Elapsed += OnTimedEvent;
        aTimer.AutoReset = true;
        aTimer.Enabled = true;
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
                          e.SignalTime);
    }
}
// The example displays output like the following:
//       Press the Enter key to exit the application...
//
//       The application started at 09:40:29.068
//       The Elapsed event was raised at 09:40:31.084
//       The Elapsed event was raised at 09:40:33.100
//       The Elapsed event was raised at 09:40:35.100
//       The Elapsed event was raised at 09:40:37.116
//       The Elapsed event was raised at 09:40:39.116
//       The Elapsed event was raised at 09:40:41.117
//       The Elapsed event was raised at 09:40:43.132
//       The Elapsed event was raised at 09:40:45.133
//       The Elapsed event was raised at 09:40:47.148
//
//       Terminating the application...
open System
open System.Timers

let onTimedEvent source (e: ElapsedEventArgs) =
    printfn $"""The Elapsed event was raised at {e.SignalTime.ToString "HH:mm:ss.fff"}"""

// Create a timer with a two second interval.
let aTimer = new Timer 2000
// Hook up the Elapsed event for the timer. 
aTimer.Elapsed.AddHandler onTimedEvent
aTimer.AutoReset <- true
aTimer.Enabled <- true

printfn "\nPress the Enter key to exit the application...\n"
printfn $"""The application started at {DateTime.Now.ToString "HH:mm:ss.fff"}"""
stdin.ReadLine() |> ignore
aTimer.Stop()
aTimer.Dispose()

printfn "Terminating the application..."

// The example displays output like the following:
//       Press the Enter key to exit the application...
//
//       The application started at 09:40:29.068
//       The Elapsed event was raised at 09:40:31.084
//       The Elapsed event was raised at 09:40:33.100
//       The Elapsed event was raised at 09:40:35.100
//       The Elapsed event was raised at 09:40:37.116
//       The Elapsed event was raised at 09:40:39.116
//       The Elapsed event was raised at 09:40:41.117
//       The Elapsed event was raised at 09:40:43.132
//       The Elapsed event was raised at 09:40:45.133
//       The Elapsed event was raised at 09:40:47.148
//
//       Terminating the application...
Imports System.Timers

Public Module Example
    Private aTimer As System.Timers.Timer

    Public Sub Main()
        SetTimer()

      Console.WriteLine("{0}Press the Enter key to exit the application...{0}",
                        vbCrLf)
      Console.WriteLine("The application started at {0:HH:mm:ss.fff}",
                        DateTime.Now)
      Console.ReadLine()
      aTimer.Stop()
      aTimer.Dispose()

      Console.WriteLine("Terminating the application...")
    End Sub

    Private Sub SetTimer()
        ' Create a timer with a two second interval.
        aTimer = New System.Timers.Timer(2000)
        ' Hook up the Elapsed event for the timer. 
        AddHandler aTimer.Elapsed, AddressOf OnTimedEvent
        aTimer.AutoReset = True
        aTimer.Enabled = True
    End Sub

    ' The event handler for the Timer.Elapsed event. 
    Private Sub OnTimedEvent(source As Object, e As ElapsedEventArgs)
        Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
                          e.SignalTime)
    End Sub 
End Module
' The example displays output like the following:
'       Press the Enter key to exit the application...
'
'       The application started at 09:40:29.068
'       The Elapsed event was raised at 09:40:31.084
'       The Elapsed event was raised at 09:40:33.100
'       The Elapsed event was raised at 09:40:35.100
'       The Elapsed event was raised at 09:40:37.116
'       The Elapsed event was raised at 09:40:39.116
'       The Elapsed event was raised at 09:40:41.117
'       The Elapsed event was raised at 09:40:43.132
'       The Elapsed event was raised at 09:40:45.133
'       The Elapsed event was raised at 09:40:47.148
'
'       Terminating the application...

Keterangan

Komponen Timer adalah timer berbasis server yang memunculkan Elapsed peristiwa di aplikasi Anda setelah jumlah milidetik dalam Interval properti telah berlalu. Anda dapat mengonfigurasi Timer objek untuk menaikkan peristiwa hanya sekali atau berulang kali menggunakan AutoReset properti . Biasanya, Timer objek dideklarasikan pada tingkat kelas sehingga tetap berada dalam cakupan selama diperlukan. Anda kemudian dapat menangani peristiwanya Elapsed untuk menyediakan pemrosesan reguler. Misalnya, Anda memiliki server penting yang harus terus berjalan 24 jam sehari, 7 hari seminggu. Anda dapat membuat layanan yang menggunakan Timer objek untuk memeriksa server secara berkala dan memastikan bahwa sistem aktif dan berjalan. Jika sistem tidak merespons, layanan dapat mencoba memulai ulang server atau memberi tahu administrator.

Penting

Kelas Timer tidak tersedia untuk semua implementasi dan versi .NET, seperti .NET Standard 1.6 dan versi yang lebih rendah. Dalam kasus ini, Anda dapat menggunakan kelas sebagai gantinya System.Threading.Timer .

Jenis ini mengimplementasikan IDisposable antarmuka. Ketika Anda telah selesai menggunakan jenis , Anda harus membuangnya baik secara langsung atau tidak langsung. Untuk membuang jenis secara langsung, panggil metodenya Dispose dalam try/catch blok. Untuk membuangnya secara tidak langsung, gunakan konstruksi bahasa seperti using (dalam C#) atau Using (di Visual Basic). Untuk informasi selengkapnya, lihat bagian "Menggunakan Objek yang Mengimplementasikan IDisposable" dalam IDisposable topik antarmuka.

Kelas berbasis System.Timers.Timer server dirancang untuk digunakan dengan utas pekerja di lingkungan multithreaded. Timer server dapat berpindah di antara utas untuk menangani peristiwa yang dinaikkan Elapsed , menghasilkan lebih banyak akurasi daripada timer Windows dalam menaikkan peristiwa tepat waktu.

Komponen System.Timers.Timer menaikkan Elapsed peristiwa, berdasarkan nilai (dalam milidetik) Interval properti. Anda dapat menangani peristiwa ini untuk melakukan pemrosesan yang Anda butuhkan. Misalnya, Anda memiliki aplikasi penjualan online yang terus memposting pesanan penjualan ke database. Layanan yang mengkompilasi instruksi untuk pengiriman beroperasi pada batch pesanan daripada memproses setiap pesanan satu per satu. Anda dapat menggunakan Timer untuk memulai pemrosesan batch setiap 30 menit.

Penting

Kelas System.Timers.Timer memiliki resolusi yang sama dengan jam sistem. Ini berarti bahwa Elapsed peristiwa akan diaktifkan pada interval yang ditentukan oleh resolusi jam sistem jika Interval properti kurang dari resolusi jam sistem. Untuk informasi selengkapnya, lihat Interval properti.

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 AutoReset diatur ke false, objek System.Timers.Timer akan menaikkan Elapsed peristiwa hanya sekali, setelah yang pertama Interval berlalu. Untuk terus menaikkan Elapsed peristiwa secara teratur pada interval yang ditentukan oleh Interval, atur AutoReset ke true, yang merupakan nilai default.

Komponen Timer menangkap dan menekan semua pengecualian yang dilemparkan oleh penanganan aktivitas untuk peristiwa tersebut Elapsed . Perilaku ini dapat berubah dalam rilis .NET Framework di masa mendatang. Namun, perhatikan bahwa ini tidak benar dari penanganan aktivitas yang dijalankan secara asinkron dan menyertakan await operator (dalam C#) atau Await operator (di Visual Basic). Pengecualian yang dilemparkan dalam penanganan aktivitas ini disebarluaskan kembali ke utas panggilan, seperti yang diilustrasikan contoh berikut. Untuk informasi selengkapnya tentang pengecualian yang dilemparkan dalam metode asinkron, lihat Penanganan Pengecualian.

using System;
using System.Threading.Tasks;
using System.Timers;

class Example
{
   static void Main()
   {
      Timer timer = new Timer(1000);
      timer.Elapsed += async ( sender, e ) => await HandleTimer();
      timer.Start();
      Console.Write("Press any key to exit... ");
      Console.ReadKey();
   }

   private static Task HandleTimer()
   {
     Console.WriteLine("\nHandler not implemented..." );
     throw new NotImplementedException();
   }
}
// The example displays output like the following:
//   Press any key to exit...
//   Handler not implemented...
//   
//   Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
//      at Example.HandleTimer()
//      at Example.<<Main>b__0>d__2.MoveNext()
//   --- End of stack trace from previous location where exception was thrown ---
//      at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
//      at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
//      at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
//      at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
//      at System.Threading.ThreadPoolWorkQueue.Dispatch()
open System
open System.Threading.Tasks
open System.Timers

let handleTimer () =
    printfn "\nHandler not implemented..."
    raise (NotImplementedException()): Task

let timer = new Timer 1000
timer.Elapsed.AddHandler(fun sender e -> task { do! handleTimer () } |> ignore)
timer.Start()
printf "Press any key to exit... "
Console.ReadKey() |> ignore

// The example displays output like the following:
//   Press any key to exit...
//   Handler not implemented...
//
//   Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
//      at Example.HandleTimer()
//      at Example.<<Main>b__0>d__2.MoveNext()
//   --- End of stack trace from previous location where exception was thrown ---
//      at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
//      at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
//      at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
//      at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
//      at System.Threading.ThreadPoolWorkQueue.Dispatch()
Imports System.Threading.Tasks
Imports System.Timers

Public Module Example
   Public Sub Main()
      Dim timer As New Timer(1000)  
      AddHandler timer.Elapsed, AddressOf Example.HandleTimer     
      'timer.Elapsed = Async ( sender, e ) => await HandleTimer()
      timer.Start()
      Console.Write("Press any key to exit... ")
      Console.ReadKey()
   End Sub

   Private Async Sub HandleTimer(sender As Object, e As EventArgs)
      Await Task.Run(Sub()
                        Console.WriteLine()
                        Console.WriteLine("Handler not implemented..." )
                        Throw New NotImplementedException()
                     End Sub)   
   End Sub
End Module
' The example displays output like the following:
'   Press any key to exit...
'   Handler not implemented...
'   
'   Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
'      at Example._Lambda$__1()
'      at System.Threading.Tasks.Task.Execute()
'   --- End of stack trace from previous location where exception was thrown ---
'      at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
'      at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
'      at Example.VB$StateMachine_0_HandleTimer.MoveNext()
'   --- End of stack trace from previous location where exception was thrown ---
'      at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
'      at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
'      at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
'      at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
'      at System.Threading.ThreadPoolWorkQueue.Dispatch()

SynchronizingObject Jika properti adalah null, Elapsed peristiwa dinaikkan pada ThreadPool utas. Jika pemrosesan Elapsed peristiwa berlangsung lebih lama dari Interval, peristiwa mungkin dinaikkan lagi pada utas lain ThreadPool . Dalam situasi ini, penanganan aktivitas harus masuk kembali.

Catatan

Metode penanganan peristiwa mungkin berjalan pada satu utas pada saat yang sama saat utas Stop lain memanggil metode atau mengatur Enabled properti ke false. Ini dapat mengakibatkan Elapsed peristiwa dinaikkan setelah timer dihentikan. Contoh kode untuk Stop metode menunjukkan salah satu cara untuk menghindari kondisi balapan ini.

Bahkan jika SynchronizingObject tidak null, Elapsed peristiwa dapat terjadi setelah Dispose metode atau Stop dipanggil atau setelah Enabled properti diatur ke false, karena sinyal untuk menaikkan Elapsed peristiwa selalu diantrekan untuk eksekusi pada utas kumpulan utas. Salah satu cara untuk mengatasi kondisi balapan ini adalah dengan mengatur bendera yang memberi tahu penanganan aktivitas agar Elapsed peristiwa mengabaikan peristiwa berikutnya.

Jika Anda menggunakan System.Timers.Timer kelas dengan elemen antarmuka pengguna, seperti formulir atau kontrol, tanpa menempatkan timer pada elemen antarmuka pengguna tersebut, tetapkan formulir atau kontrol yang berisi Timer ke SynchronizingObject properti , sehingga peristiwa dinafaskan ke utas antarmuka pengguna.

Untuk daftar nilai properti default untuk instans Timer, lihat Timer konstruktor.

Tip

.NET mencakup empat kelas bernama Timer, yang masing-masing menawarkan fungsionalitas yang berbeda:

  • System.Timers.Timer (topik ini): mengaktifkan 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: 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: 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(hanya .NET Framework): komponen ASP.NET yang melakukan postback halaman web asinkron atau sinkron secara berkala.

Konstruktor

Timer()

Menginisialisasi instans Timer baru kelas, dan mengatur semua properti ke nilai awalnya.

Timer(Double)

Menginisialisasi instans Timer baru kelas, dan mengatur Interval properti ke jumlah milidetik yang ditentukan.

Timer(TimeSpan)

Menginisialisasi instans Timer baru kelas, mengatur Interval properti ke periode yang ditentukan.

Properti

AutoReset

Mendapatkan atau mengatur Boolean yang menunjukkan apakah Timer harus menaikkan Elapsed peristiwa hanya sekali (false) atau berulang kali (true).

CanRaiseEvents

Mendapatkan nilai yang menunjukkan apakah komponen dapat menaikkan peristiwa.

(Diperoleh dari Component)
Container

IContainer Mendapatkan yang berisi Component.

(Diperoleh dari Component)
DesignMode

Mendapatkan nilai yang menunjukkan apakah Component saat ini dalam mode desain.

(Diperoleh dari Component)
Enabled

Mendapatkan atau menetapkan nilai yang menunjukkan apakah Timer harus menaikkan Elapsed peristiwa.

Events

Mendapatkan daftar penanganan aktivitas yang dilampirkan ke ini Component.

(Diperoleh dari Component)
Interval

Mendapatkan atau mengatur interval, yang dinyatakan dalam milidetik, untuk meningkatkan Elapsed peristiwa.

Site

Mendapatkan atau mengatur situs yang mengikat ke Timer kontainernya dalam mode desain.

SynchronizingObject

Mendapatkan atau mengatur objek yang digunakan untuk marshal panggilan penanganan aktivitas yang dikeluarkan saat interval telah berlalu.

Metode

BeginInit()

Memulai inisialisasi run-time dari yang Timer digunakan pada formulir atau oleh komponen lain.

Close()

Merilis sumber daya yang digunakan oleh Timer.

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 Componentdigunakan oleh .

(Diperoleh dari Component)
Dispose(Boolean)

Merilis semua sumber daya yang digunakan oleh saat ini Timer.

EndInit()

Mengakhiri inisialisasi run-time yang Timer digunakan pada formulir atau oleh komponen lain.

Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
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)
GetService(Type)

Mengembalikan objek yang mewakili layanan yang disediakan oleh Component atau oleh Container.

(Diperoleh dari Component)
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)
Start()

Mulai menaikkan Elapsed peristiwa dengan mengatur Enabled ke true.

Stop()

Berhenti menaikkan Elapsed acara dengan mengatur Enabled ke false.

ToString()

Mengembalikan yang String berisi nama Component, jika ada. Metode ini tidak boleh ditimpa.

(Diperoleh dari Component)

Acara

Disposed

Terjadi ketika komponen dibuang oleh panggilan ke Dispose() metode .

(Diperoleh dari Component)
Elapsed

Terjadi ketika interval berlalu.

Berlaku untuk

Keamanan Thread

Setiap anggota publik static jenis ini aman untuk utas. Setiap anggota instans tidak dijamin aman untuk utas.

Lihat juga