Keduanya System.Timers.Timer
dan System.Threading.Timer
akan bekerja untuk layanan.
Pengatur waktu yang ingin Anda hindari adalah System.Web.UI.Timer
dan System.Windows.Forms.Timer
, yang masing-masing untuk aplikasi ASP dan WinForms. Menggunakan itu akan menyebabkan layanan memuat rakitan tambahan yang tidak benar-benar diperlukan untuk jenis aplikasi yang Anda buat.
Gunakan System.Timers.Timer
seperti contoh berikut (juga, pastikan Anda menggunakan variabel tingkat kelas untuk mencegah pengumpulan sampah, seperti yang dinyatakan dalam jawaban Tim Robinson):
using System;
using System.Timers;
public class Timer1
{
private static System.Timers.Timer aTimer;
public static void Main()
{
// Normally, the timer is declared at the class level,
// so that it stays in scope as long as it is needed.
// If the timer is declared in a long-running method,
// KeepAlive must be used to prevent the JIT compiler
// from allowing aggressive garbage collection to occur
// before the method ends. (See end of method.)
//System.Timers.Timer aTimer;
// Create a timer with a ten second interval.
aTimer = new System.Timers.Timer(10000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
// Set the Interval to 2 seconds (2000 milliseconds).
aTimer.Interval = 2000;
aTimer.Enabled = true;
Console.WriteLine("Press the Enter key to exit the program.");
Console.ReadLine();
// If the timer is declared in a long-running method, use
// KeepAlive to prevent garbage collection from occurring
// before the method ends.
//GC.KeepAlive(aTimer);
}
// Specify what you want to happen when the Elapsed event is
// raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
}
}
/* This code example produces output similar to the following:
Press the Enter key to exit the program.
The Elapsed event was raised at 5/20/2007 8:42:27 PM
The Elapsed event was raised at 5/20/2007 8:42:29 PM
The Elapsed event was raised at 5/20/2007 8:42:31 PM
...
*/
Jika Anda memilih System.Threading.Timer
, Anda dapat menggunakan sebagai berikut:
using System;
using System.Threading;
class TimerExample
{
static void Main()
{
AutoResetEvent autoEvent = new AutoResetEvent(false);
StatusChecker statusChecker = new StatusChecker(10);
// Create the delegate that invokes methods for the timer.
TimerCallback timerDelegate =
new TimerCallback(statusChecker.CheckStatus);
// Create a timer that signals the delegate to invoke
// CheckStatus after one second, and every 1/4 second
// thereafter.
Console.WriteLine("{0} Creating timer.\n",
DateTime.Now.ToString("h:mm:ss.fff"));
Timer stateTimer =
new Timer(timerDelegate, autoEvent, 1000, 250);
// When autoEvent signals, change the period to every
// 1/2 second.
autoEvent.WaitOne(5000, false);
stateTimer.Change(0, 500);
Console.WriteLine("\nChanging period.\n");
// When autoEvent signals the second time, dispose of
// the timer.
autoEvent.WaitOne(5000, false);
stateTimer.Dispose();
Console.WriteLine("\nDestroying timer.");
}
}
class StatusChecker
{
int invokeCount, 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 Main.
invokeCount = 0;
autoEvent.Set();
}
}
}
Kedua contoh tersebut berasal dari halaman MSDN.
Jangan gunakan layanan untuk ini. Buat aplikasi normal dan buat tugas terjadwal untuk menjalankannya.
Ini adalah praktik terbaik yang umum dipegang. Jon Galloway setuju dengan saya. Atau mungkin sebaliknya. Either way, faktanya adalah bahwa itu bukan praktik terbaik untuk membuat layanan windows untuk melakukan tugas yang terputus-putus menjalankan pengatur waktu.
sumber
Salah satu harus bekerja dengan baik. Faktanya, System.Threading.Timer menggunakan System.Timers.Timer secara internal.
Karena itu, mudah untuk menyalahgunakan System.Timers.Timer. Jika Anda tidak menyimpan objek Timer dalam variabel di suatu tempat, maka objek tersebut kemungkinan besar akan dibuang. Jika itu terjadi, pengatur waktu Anda tidak akan menyala lagi. Panggil metode Dispose untuk menghentikan timer, atau gunakan kelas System.Threading.Timer, yang merupakan pembungkus yang sedikit lebih bagus.
Masalah apa yang sudah Anda lihat sejauh ini?
sumber
System.Timers.Timer
karena tidak akan menangani Pengecualian yang diberikan padanya.Saya setuju dengan komentar sebelumnya yang mungkin paling baik untuk mempertimbangkan pendekatan yang berbeda. Saran saya adalah menulis aplikasi konsol dan menggunakan penjadwal windows:
Ini akan:
sumber
Seperti yang telah dinyatakan baik
System.Threading.Timer
danSystem.Timers.Timer
akan berhasil. Perbedaan besar antara keduanya adalahSystem.Threading.Timer
pembungkus yang mengelilingi yang lainnya.Ini memberi saya masalah besar di masa lalu jadi saya akan selalu menggunakan 'System.Threading.Timer' dan masih menangani pengecualian Anda dengan sangat baik.
sumber
Saya tahu utas ini agak tua tetapi berguna untuk skenario tertentu yang saya miliki dan saya pikir perlu dicatat bahwa ada alasan lain mengapa
System.Threading.Timer
mungkin pendekatan yang baik. Saat Anda harus menjalankan Pekerjaan secara berkala yang mungkin membutuhkan waktu lama dan Anda ingin memastikan bahwa seluruh masa tunggu digunakan di antara pekerjaan atau jika Anda tidak ingin pekerjaan dijalankan lagi sebelum pekerjaan sebelumnya selesai dalam kasus di mana pekerjaan membutuhkan waktu lebih lama dari periode timer. Anda bisa menggunakan yang berikut ini:sumber