I saw this code in Richter's book:
The following code demonstrates how to invoke the thread pool thread method starting immediately and then every 2 seconds after that:
/*1*/ internal static class TimerDemo /*2*/ { /*3*/ private static Timer s_timer; /*4*/ public static void Main() /*5*/ { /*6*/ Console.WriteLine("Checking status every 2 seconds"); /*7*/ // Create the Timer ensuring that it never fires. This ensures that /*8*/ // s_timer refers to it BEFORE Status is invoked by a thread pool thread /*9*/ s_timer = new Timer(Status, null, Timeout.Infinite, Timeout.Infinite); /*10*/ // Now that s_timer is assigned to, we can let the timer fire knowing /*11*/ // that calling Change in Status will not throw a NullReferenceException /*12*/ s_timer.Change(0, Timeout.Infinite); /*13*/ Console.ReadLine(); // Prevent the process from terminating /*14*/ } /*15*/ // This method signature must match the TimerCallback delegate /*16*/ private static void Status(Object state) /*17*/ { /*18*/ // This method is executed by a thread pool thread /*20*/ Console.WriteLine("In Status at {0}", DateTime.Now); /*21*/ Thread.Sleep(1000); // Simulates other work (1 second) /*22*/ // Just before returning, have the Timer fire again in 2 seconds /*23*/ s_timer.Change(2000, Timeout.Infinite); /*24*/ // When this method returns, the thread goes back /*25*/ // to the pool and waits for another work item /*26*/ } /*27*/ }
However (sorry) I still don't understand which lines #7,#8 mean
And, of course, why it was initialized (line number 9) to Timeout.Infinite (which, obviously: "do not start the timer")
(I understand the general goal of preventing duplication, but I believe that there is a condition for the GC race here).
Edit
System.Threading namespace
Royi namir
source share