说起定时,很多人都会使用计时器来做,事实上,在C#中使用时间来触发事件更加方便。当然使用计时器也能触发事件,事实上这篇文章的重点是对于C#事件的使用,只是加入了一点简单的实例。昨天收到公司要做个定时播放音乐的小程序,下面看看我怎么实现的吧。
首先声明几个需要的事件和委托。
复制
public delegate void mytimer(); public event mytimer playmusic; public event mytimer stopmusic; public event mytimer shutdown;
然后在程序启动时注册事件并启动一条线程,用来计时,根据时间触发相应的事件,计时线程代码如下。
复制
this.playmusic += callback_play; this.stopmusic += callback_stop; this.shutdown += callback_down; Thread mytherad = new Thread(timerp); mytherad.IsBackground = true; mytherad.Start(); public void timerp() { String Datestr = DateTime.Now.ToString("yyyy-MM-dd"); long timeStamp = timetemp(Datestr + " " + autodown); // 关机时间戳 long play1 = timetemp(Datestr + " 08:50:00"); // 第一次播放时间戳 long play2 = timetemp(Datestr + " 09:00:00"); // 第二次播放时间戳 long play3 = timetemp(Datestr + " 09:10:00"); // 第三次播放时间戳 long play4 = timetemp(Datestr + " 09:20:00"); // 第四次播放时间戳 long play1stop = timetemp(Datestr + " 08:55:00"); // 第一次停止时间戳 long play2stop = timetemp(Datestr + " 09:05:00"); // 第二次停止时间戳 long play3stop = timetemp(Datestr + " 09:15:00"); // 第三次停止时间戳 long play4stop = timetemp(Datestr + " 09:25:00"); // 第四次停止时间戳 System.Console.WriteLine(timeStamp); while(true){ TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0); long timestap1 = Convert.ToInt64(ts.TotalSeconds); System.Console.WriteLine(timestap1); if (timestap1 == timeStamp) { shutdown(); } if (timestap1 == play1 || timestap1 == play2 || timestap1 == play3 || timestap1 == play4) { playmusic(); } if (timestap1 == play1stop || timestap1 == play2stop || timestap1 == play3stop || timestap1 == play4stop) { stopmusic(); } Thread.Sleep(1000); } }
根据时间戳判断是否到了指定时间,到了就触发相应的事件,然后在事件中处理即可。
复制
public void callback_play() { System.Console.WriteLine("播放音乐"); } public void callback_stop() { System.Console.WriteLine("停止播放音乐"); } public void callback_down() { System.Console.WriteLine("关机触发"); }
我写完了,是不是很简单。哈哈哈,还有个转换时间戳的,一起贴出来吧。
复制
public long timetemp(String str) { DateTime dt; DateTimeFormatInfo dtFormat = new DateTimeFormatInfo(); dtFormat.ShortDatePattern = "yyyy-MM-dd hh:mm:ss"; dt = Convert.ToDateTime(str, dtFormat); System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区 long timeStamp = (long)(dt - startTime).TotalSeconds; // 相差秒数 return timeStamp; }
传入日期时间字符串即可返回对应的时间戳。
评论 (0)