Use of timer in Windows Service

Source: Internet
Author: User

When you use C # To write Windows Services, many examples on the Internet say that you can use the timer in the Toolkit, but in fact this timer does not work, for specific reasons, microsoft claimed to be a framework bug.

Both timer in Windows form and timer in components are inherited from system. windows. form. timer, not the system we need. timers, inherited from system. timers can only be created manually.

Public windowsservicedemo ()
{
Initializecomponent ();
System. Timers. Timer T = new system. Timers. Timer (1000); // instantiate the Timer class and set the interval to 10000 milliseconds;
T. elapsed + = new system. Timers. elapsedeventhandler (timeelapse); // execute the event at the time of arrival;
T. autoreset = true; // set whether to execute once (false) or always execute (true );
T. Enabled = true; // whether to execute the system. Timers. Timer. elapsed event;
}
Public void timeelapse (Object source, system. Timers. elapsedeventargs E)
{
// EventLog log = new EventLog ();
// Log. Source = "My applications ";
// Log. writeentry ("one second call", eventlogentrytype. information );
Filestream FS = new filestream (@ "D:/timetick.txt", filemode. openorcreate, fileaccess. Write );
Streamwriter m_streamwriter = new streamwriter (FS );
M_streamwriter.basestream.seek (0, seekorigin. End );
M_streamwriter.writeline ("after one second" + datetime. Now. tostring () + "/N ");
M_streamwriter.flush ();
M_streamwriter.close ();
FS. Close ();
 

}

 

========================================================== ======================================

Both partiesSystem.Timers.TimerAndSystem.Threading.TimerWork services.

What this timer should avoid isSystem.Web.UI.TimerAndSystem.Windows.Forms.TimerThis is the ASP application and winforms respectively. Using these will result in additional assembly of the service load. This is not a real application and you need a building type.

Use an example similar to the followingSystem.Timers.TimerIn addition, make sure that you use a class-level variable to prevent garbage collection ):

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
...
*/

If you selectSystem.Threading.TimerYou can use the following:

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();
}
}
}

The two examples are from the msdn webpage.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.