欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c#一个定时重启的小程序实现代码第1/2页

程序员文章站 2022-06-30 09:54:22
原理我像大家都很清楚,这里只说.net(c#实现)。服务器每次启动或者重启,都是没登陆的。那意味着启动项里不只能做,我就考虑到使用windows服务。windows服务在系...
原理我像大家都很清楚,这里只说.net(c#实现)。服务器每次启动或者重启,都是没登陆的。那意味着启动项里不只能做,我就考虑到使用windows服务。windows服务在系统加载时候就会启动所有服务,把程序写进里面应该没错了。
需要重启,那就要一个时间来效验,写法都有很多。我这里采用ini来存放。
time 记录要重启的时间,验证时间。
day 用来累加天数。
复制代码 代码如下:

[reboot]
time=02:02:01
day=3


使用system.timers.timer循环验证时间(不知道始终对占用资源是否会太大)
复制代码 代码如下:

private void timer_elapsed(object sender, elapsedeventargs e)
{
if (datetime.now.tostring("yyyy-mm-dd hh:mm:ss") == retime)
{
shoutdown.doexitwin(0x00000002);
}
}


服务首次启动初始化重启的时间以及天数,初始化时候读取ini文件,把时间放进变量里,将天数累加3天。(减少读写i/o的开销)
始终不停的循环验证。
复制代码 代码如下:

protected override void onstart(string[] args)
{
ini = new inifile(appdomain.currentdomain.basedirectory + "current.ini");
time = ini.inireadvalue("reboot", "time");
day = ini.inireadvalue("reboot", "day");

retime = datetime.now.adddays(double.parse(day)).tostring("yyyy-mm-dd ") + time;

autotimer.autoreset = true;
autotimer.enabled = true;
autotimer.elapsed += timer_elapsed;
autotimer.start();
}


这里可以改造成用线程来做,我想应该比这个会好。

放出一段自动备份sqlserver的代码端,将后会发布。
复制代码 代码如下:

private readonly dictionary<string, bool> cache =
new dictionary<string, bool>();

private readonly inifile ini = new inifile(sysutil.getmappath("task.ini"));
private bool _flag;
private string day;
private string fhour;
private string fweek;
private string hour;
private thread timethread;


protected override void onstart(string[] args)
{
go();
}

protected override void onstop()
{
stopthread();
}

/// <summary>
/// 执行
/// </summary>
public void go()
{
day = datetime.now.tostring("yyyy-mm-dd");
fweek = ini.inireadvalue("task", "week");
fhour = ini.inireadvalue("task", "hour");
runthread();
}

/// <summary>
/// 执行线程
/// </summary>
private void runthread()
{
//这里开始线程
_flag = true;
timethread = new thread(threadtimer);
timethread.start();
}

/// <summary>
/// 停止线程
/// </summary>
private void stopthread()
{
_flag = false;
if (timethread != null) timethread.abort();
}

/// <summary>
/// 线程方法
/// </summary>
public void threadtimer()
{
while (_flag)
{
if (fweek == "") //按天
{
runbackup();
}
else
{
// 按周
if (weekswitch(fweek) == dateutil.getweek(datetime.now) && weekswitch(fweek) != "")
{
runbackup();
}
}
}
}

/// <summary>
/// 数据库列表
/// </summary>
private datatable gettasklist()
{
dataset ds = new dataset();
ds.readxml(sysutil.getmappath("db.xml"));
return ds.tables["dataset"];
}

private void runbackup()
{
if (!file.exists(sysutil.getmappath("db.xml"))) return;

day = datetime.now.tostring("yyyy-mm-dd");

hour = datetime.now.tostring("hh");
if (hour.equals(fhour))
{
if (!cache.containskey(day)) cache.add(day, false);

if (fweek != "" && cache[day] == false)
{
if (weekswitch(fweek) == dateutil.getweek(datetime.parse(day)))
{
startwork();
cache[day] = true;
}
}
else
{
if (cache[day] == false)
{
startwork();
cache[day] = true;
}
}
}

1