c#一个定时重启的小程序实现代码第1/2页
- 作者: 裤裆放不下
- 来源: 51数据库
- 2021-10-19
原理我像大家都很清楚,这里只说.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
12下一页
推荐阅读
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0