Monday, June 15, 2009

Threading || Timers



The easiest way to execute a method periodically is using a timer.

There are three different Timer classes been provided.


  • System.Threading.Timer
  • System.Timers.Timer
  • System.Windows.Forms.Timer





The threading timer takes advantage of the thread pool, Allowing Many Timers To Be Created without the overhead of many threads.

Timer is a fairly simple class, with a constructor and just two methods (a delight for minimalists, as well as book authors!).




class Program


        static void Main()


            Timer tmr = new Timer(Tick, "tick...", 5000, 1000);




        static void Tick(object data)


            Console.WriteLine(data); // Writes "tick..."






Here  timer calls the Tick method which writes "tick..." after 5 seconds

have elapsed, then every second after that – until the user presses Enter:






This simply wraps System.Threading.Timer, providing additional convenience while Using The Same Thread Pool – and the identical underlying engine.

Here's a summary of its added features:


  • A Component implementation, allowing it to be sited in the Visual Studio Designer
  • An Interval property instead of a Change method
  • An Elapsed event instead of a callback delegate
  • An Enabled property to start and pause the timer (its default value being false)
  • Start and Stop methods in case you're confused by Enabled
  • An AutoReset flag for indicating a recurring event (default value true)



public partial class Form1 : Form


    private System.Timers.Timer timer = null;

    public Form1()




        int timerPeriod = 30000;

        timer = new System.Timers.Timer(timerPeriod);

        timer.Elapsed += new ElapsedEventHandler(this.ticker_Elapsed);


        label1.Text = "Not Started ...";



    private void button1_Click(object sender, EventArgs e)



        label1.Text = "Started ...";



    private void ticker_Elapsed(object sender, ElapsedEventArgs e)


           using (SqlConnection cnx = ConnectionPool.GetConnection())


               // Code Here




    private void button2_Click(object sender, EventArgs e)



        label1.Text = "Stopped ...";








  • While similar to System.Timers.Timer in its interface, it's radically different in the functional sense.
  • A Windows Forms timer Does Not Use The Thread Pool, instead firing its "Tick" event always on the same thread that originally created the timer.
  • Assuming this is the main thread – also responsible for instantiating all the forms and controls in the Windows Forms application – the timer's event handler is then able to interact with the forms and controls without violating thread-safety – or the impositions of apartment-threading.
  • Control.Invoke is not required.
  • The Windows timer is, in effect, a single-threaded timer.


Note –


There's an equivalent single-threaded timer for WPF, called DispatcherTimer.



Hope this helps.


Thanks & Regards,

Arun Manglick || Senior Tech Lead



No comments:

Post a Comment