让代码更简单

C#简单的定时任务写法

重要:本文最后更新于2019-08-15 08:26:19,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

说起定时,很多人都会使用计时器来做,事实上,在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;
}

传入日期时间字符串即可返回对应的时间戳。

感觉很棒!可以赞赏支持我哟~

5 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐