c# - Best Timer for using in a Windows service -
i need create windows service execute every n period of time.
question is:
timer control should use: system.timers.timer
or system.threading.timer
one? influence on something?
i asking because heard many evidences non correct work of system.timers.timer
in windows services.
thank you.
both system.timers.timer
, system.threading.timer
work services.
the timers want avoid system.web.ui.timer
, system.windows.forms.timer
, respectively asp applications , winforms. using cause service load additional assembly not needed type of application building.
use system.timers.timer
following example (also, make sure use class level variable prevent garbage collection, stated in tim robinson's answer):
using system; using system.timers; public class timer1 { private static system.timers.timer atimer; public static void main() { // normally, timer declared @ class level, // stays in scope long needed. // if timer declared in long-running method, // keepalive must used prevent jit compiler // allowing aggressive garbage collection occur // before method ends. (see end of method.) //system.timers.timer atimer; // create timer ten second interval. atimer = new system.timers.timer(10000); // hook elapsed event timer. atimer.elapsed += new elapsedeventhandler(ontimedevent); // set interval 2 seconds (2000 milliseconds). atimer.interval = 2000; atimer.enabled = true; console.writeline("press enter key exit program."); console.readline(); // if timer declared in long-running method, use // keepalive prevent garbage collection occurring // before method ends. //gc.keepalive(atimer); } // specify want happen when elapsed event // raised. private static void ontimedevent(object source, elapsedeventargs e) { console.writeline("the elapsed event raised @ {0}", e.signaltime); } } /* code example produces output similar following: press enter key exit program. elapsed event raised @ 5/20/2007 8:42:27 pm elapsed event raised @ 5/20/2007 8:42:29 pm elapsed event raised @ 5/20/2007 8:42:31 pm ... */
if choose system.threading.timer
, can use follows:
using system; using system.threading; class timerexample { static void main() { autoresetevent autoevent = new autoresetevent(false); statuschecker statuschecker = new statuschecker(10); // create delegate invokes methods timer. timercallback timerdelegate = new timercallback(statuschecker.checkstatus); // create timer signals delegate invoke // checkstatus after 1 second, , 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 period every // 1/2 second. autoevent.waitone(5000, false); statetimer.change(0, 500); console.writeline("\nchanging period.\n"); // when autoevent signals second time, dispose of // timer. autoevent.waitone(5000, false); statetimer.dispose(); console.writeline("\ndestroying timer."); } } class statuschecker { int invokecount, maxcount; public statuschecker(int count) { invokecount = 0; maxcount = count; } // method called 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 counter , signal main. invokecount = 0; autoevent.set(); } } }
both examples comes msdn pages.
Comments
Post a Comment