Csharp/CSharp Tutorial/Development/Timer
Содержание
- 1 Annonymous event handler based on Timer
- 2 A timer demo
- 3 A Timer that fires once at the specified time
- 4 Create a Timer that runs twice a second, starting in one second
- 5 Create the delegate that the Timer will call
- 6 Create your own timer event handler
- 7 Remove event handler
- 8 Timer based action firing
- 9 Timer based application
- 10 Timer start in detail
- 11 Use the Timer to trigger event
- 12 Use Timer
- 13 Using ElapsedEventHandler and your own delegate
- 14 Using System.Threading.Timer
- 15 Using System.Timers.Timer
Annonymous event handler based on Timer
<source lang="csharp">using System; using System.Timers; using System.Threading; class MainClass {
static void Main() { MyTimerClass mc = new MyTimerClass(); mc.Elapsed += delegate(object obj, EventArgs e){ Console.WriteLine("This is the anonymous method."); }; Thread.Sleep(2000); }
} public class MyTimerClass {
public event EventHandler Elapsed; private void OnOneSecond(object obj, EventArgs e) { if (Elapsed != null) Elapsed(obj, e); } private System.Timers.Timer MyPrivateTimer = new System.Timers.Timer(); public MyTimerClass() { MyPrivateTimer.Elapsed += OnOneSecond; MyPrivateTimer.Interval = 1000; MyPrivateTimer.Enabled = true; }
}</source>
This is the anonymous method.
A timer demo
<source lang="csharp">using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime; using System.Runtime.rupilerServices; using System.Security; using System.Text; using System.Threading; public class MainClass {
public static void Main() { using (Timer t = new Timer(TimerWorker, "Testing", 0, 50)) { Thread.Sleep(500); Console.WriteLine("Shutting down timer..."); } } private static void TimerWorker(object state) { Console.WriteLine("Timer event! {0}", state); }
}</source>
Timer event! Testing Timer event! Testing Timer event! Testing Timer event! Testing Timer event! Testing Timer event! Testing Timer event! Testing Timer event! Testing Shutting down timer... Timer event! Testing
A Timer that fires once at the specified time
<source lang="csharp">using System; using System.Threading; using System.Globalization; class MainClass {
public static void Main(string[] args) { TimeSpan waitTime = new TimeSpan(1000); new Timer(delegate(object s) { Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), s); } , null, waitTime, new TimeSpan(-1)); }
}</source>
Create a Timer that runs twice a second, starting in one second
<source lang="csharp">using System; using System.Threading; class MainClass {
public static void CheckTime(Object state) { Console.WriteLine(DateTime.Now); } public static void Main() { TimerCallback tc = new TimerCallback(CheckTime); Timer t = new Timer(tc, null, 1000, 500); Console.WriteLine("Press Enter to exit"); int i = Console.Read(); // clean up the resources t.Dispose(); t = null; }
}</source>
Press Enter to exit
Create the delegate that the Timer will call
<source lang="csharp">using System; using System.Threading; class MainClass {
public static void CheckTime(Object state) { Console.WriteLine(DateTime.Now); } public static void Main() { TimerCallback tc = new TimerCallback(CheckTime); Timer t = new Timer(tc, null, 1000, 500); Console.WriteLine("Press Enter to exit"); int i = Console.Read(); // clean up the resources t.Dispose(); t = null; }
}</source>
Press Enter to exit 25/03/2007 2:27:10 PM 25/03/2007 2:27:10 PM 25/03/2007 2:27:10 PM 25/03/2007 2:27:11 PM
Create your own timer event handler
<source lang="csharp">using System; using System.Timers; using System.Threading; class MainClass {
public static void TimerHandlerA(object obj, EventArgs e) { Console.WriteLine("Class A handler called"); } public static void TimerHandlerB(object obj, EventArgs e) { Console.WriteLine("Class B handler called"); } static void Main() { MyTimerClass mc = new MyTimerClass(); mc.Elapsed += TimerHandlerA; mc.Elapsed += TimerHandlerB; Thread.Sleep(2000); }
} public class MyTimerClass {
public event EventHandler Elapsed; private void OnOneSecond(object obj, EventArgs e) { if (Elapsed != null) Elapsed(obj, e); } private System.Timers.Timer MyPrivateTimer = new System.Timers.Timer(); public MyTimerClass() { MyPrivateTimer.Elapsed += OnOneSecond; MyPrivateTimer.Interval = 1000; MyPrivateTimer.Enabled = true; }
}</source>
Class A handler called Class B handler called
Remove event handler
<source lang="csharp">using System; using System.Timers; using System.Threading; class MainClass {
public static void TimerHandlerA(object obj, EventArgs e) { Console.WriteLine("Class A handler called"); } public static void TimerHandlerB(object obj, EventArgs e) { Console.WriteLine("Class B handler called"); } static void Main() { MyTimerClass mc = new MyTimerClass(); mc.Elapsed += TimerHandlerA; mc.Elapsed += TimerHandlerB; mc.Elapsed -= TimerHandlerB; Thread.Sleep(2000); }
} public class MyTimerClass {
public event EventHandler Elapsed; private void OnOneSecond(object obj, EventArgs e) { if (Elapsed != null) Elapsed(obj, e); } private System.Timers.Timer MyPrivateTimer = new System.Timers.Timer(); public MyTimerClass() { MyPrivateTimer.Elapsed += OnOneSecond; MyPrivateTimer.Interval = 1000; MyPrivateTimer.Enabled = true; }
}</source>
Class A handler called
Timer based action firing
<source lang="csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers;
class Program { static int counter = 0; static void Main(string[] args) { Timer myTimer = new Timer(100); myTimer.Elapsed += new ElapsedEventHandler(WriteChar); myTimer.Start(); Console.ReadKey(); } static void WriteChar(object source, ElapsedEventArgs e) { Console.Write(counter++); } }</source>
Timer based application
<source lang="csharp">using System; using System.Collections.Generic; using System.Text; using System.Threading;
class Program { static void Main(string[] args) { TimerCallback timeCB = new TimerCallback(PrintTime); Timer t = new Timer( timeCB, // The TimerCallback delegate type. "Hello From Main", // Any info to pass into the called method (null for no info). 0, // Amount of time to wait before starting. 1000); // Interval of time between calls (in milliseconds). Console.WriteLine("Hit key to terminate..."); Console.ReadLine(); } static void PrintTime(object state) { Console.WriteLine("Time is: {0}, Param is: {1}",DateTime.Now.ToLongTimeString(), state.ToString()); } }</source>
Timer start in detail
<source lang="csharp">using System; using System.Threading; class MainClass {
static void PrintTime(object state) { Console.WriteLine("Time is: {0}, Param is: {1}", DateTime.Now.ToLongTimeString(), state.ToString()); } [STAThread] static void Main(string[] args) { TimerCallback timeCB = new TimerCallback(PrintTime); Timer t = new Timer( timeCB, // The TimerCallback delegate type. "Hi", // Any info to pass into the called method. 0, // Amount of time to wait before starting. 1000); // Interval of time between calls. Console.WriteLine("Hit key to terminate..."); Console.ReadLine(); }
}</source>
Hit key to terminate... Time is: 2:19:07 PM, Param is: Hi Time is: 2:19:08 PM, Param is: Hi Time is: 2:19:09 PM, Param is: Hi Time is: 2:19:10 PM, Param is: Hi ^CTerminate batch job (Y/N)? n
Use the Timer to trigger event
<source lang="csharp">using System; using System.Timers; using System.ServiceProcess; class MainClass {
private static void WriteLogEntry(object sender, ElapsedEventArgs e) { Console.WriteLine("Timer is active : " + e.SignalTime); } public static void Main() { System.Timers.Timer timer = new Timer(); double interval = 1000; timer.Interval = interval; timer.AutoReset = true; timer.Elapsed += new ElapsedEventHandler(WriteLogEntry); timer.Start(); Console.ReadLine(); }
}</source>
Timer is active : 25/03/2007 2:16:08 PM Timer is active : 25/03/2007 2:16:09 PM Timer is active : 25/03/2007 2:16:10 PM Timer is active : 25/03/2007 2:16:11 PM ^CTerminate batch job (Y/N)? n
Use Timer
<source lang="csharp">using System; using System.Threading; public class MainClass {
private static void TimerProc( object state ) { Console.WriteLine( "The current time is {0} on thread {1}", DateTime.Now, Thread.CurrentThread.GetHashCode() ); Thread.Sleep( 300 ); } static void Main() { Timer myTimer = new Timer( new TimerCallback(TimerProc), null, 0, 2000 ); Thread.Sleep(3000); myTimer.Dispose(); }
}</source>
The current time is 25/03/2007 2:17:43 PM on thread 4 The current time is 25/03/2007 2:17:45 PM on thread 4
Using ElapsedEventHandler and your own delegate
<source lang="csharp">using System.Timers; using System; using System.Collections.Generic; using System.Linq; using System.Text; public delegate void MessageHandler(string messageText); class Program {
static void Main(string[] args) { Connection myConnection = new Connection(); myConnection.MessageArrived += new MessageHandler(DisplayMessage); } public static void DisplayMessage(string message) { Console.WriteLine(message); }
} public class Connection {
public event MessageHandler MessageArrived; private Timer pollTimer; public Connection() { pollTimer = new Timer(100); pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage); pollTimer.Start(); } private static Random random = new Random(); private void CheckForMessage(object source, ElapsedEventArgs e) { if (MessageArrived == null) { MessageArrived("Hello Mum!"); } }
}</source>
Using System.Threading.Timer
<source lang="csharp">using System; using System.Threading; class MainClass {
static int _Count=0; static AutoResetEvent _ResetEvent = new AutoResetEvent(false); static int _AlarmThreadId; public static void Main() { using( Timer timer = new Timer(Alarm, null, 0, 1000) ) { _ResetEvent.WaitOne(); } if(_AlarmThreadId == Thread.CurrentThread.ManagedThreadId) { throw new ApplicationException("Thread Ids are the same."); } throw new ApplicationException(" _Count < 9"); Console.WriteLine(_AlarmThreadId); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); Console.WriteLine( _Count); } static void Alarm(object state) { _Count++; Console.WriteLine("{0}:- {1}",DateTime.Now.ToString("T"),_Count); if (_Count >= 9) { _AlarmThreadId = Thread.CurrentThread.ManagedThreadId; _ResetEvent.Set(); } }
}</source>
Using System.Timers.Timer
<source lang="csharp">using System; using System.Timers; using System.Threading; using Timer = System.Timers.Timer; class MainClass {
static int _Count=0; static AutoResetEvent _ResetEvent = new AutoResetEvent(false); static int _AlarmThreadId; public static void Main() { using( Timer timer = new Timer() ){ timer.AutoReset = true; timer.Interval = 1000; timer.Elapsed += new ElapsedEventHandler(Alarm); timer.Start(); _ResetEvent.WaitOne(); } if(_AlarmThreadId ==Thread.CurrentThread.ManagedThreadId){ throw new ApplicationException("Thread Ids are the same."); } throw new ApplicationException(" my "); Console.WriteLine(_AlarmThreadId); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); Console.WriteLine(_Count); } static void Alarm(object sender, ElapsedEventArgs eventArgs) { _Count++; Console.WriteLine("{0}:- {1}",eventArgs.SignalTime.ToString("T"),_Count); if (_Count >= 9) { _AlarmThreadId = Thread.CurrentThread.ManagedThreadId; _ResetEvent.Set(); } }
}</source>