c#一个定时重启的小程序实现代码第1/2页
程序员文章站
2023-11-18 16:49:28
原理我像大家都很清楚,这里只说.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;
}
}
}
需要重启,那就要一个时间来效验,写法都有很多。我这里采用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