时间:2021-05-20
原理我像大家都很清楚,这里只说.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;
}
}
}
12下一页阅读全文
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文以一个完整实例讲述了C#实现图片上传与浏览切换的方法,对于进行C#程序设计来说具有一定的借鉴价值。分享给大家供大家参考。具体实现代码如下:无标题页$(doc
定时关机小程序界面:实现代码:复制代码代码如下:定时关机小程序SubWindow_onLoadstrComputer="."SetobjWMIService=G
C#微信小程序服务端获取用户解密信息实例代码实现代码:usingAIOWeb.Models;usingNewtonsoft.Json;usingNewtonso
最近做一个C#项目,需要对radis进行读写。首先引入System.Configuration,如下实现代码如下:publicclassManualSugges
本文实例讲述了C#定时器实现自动执行的方法。分享给大家供大家参考。具体实现方法如下:复制代码代码如下://下面讲一个打开窗体定时执行按钮的东西privatevo