服务器定时重启小程序,c#一个定时重启的小程序实现代码

原理我像大家都很清楚,这里只说.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 cache =

new Dictionary();

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();

}

///

/// 执行

///

public void Go()

{

day = DateTime.Now.ToString("yyyy-MM-dd");

fWeek = ini.IniReadValue("Task", "Week");

fHour = ini.IniReadValue("Task", "Hour");

RunThread();

}

///

/// 执行线程

///

private void RunThread()

{

//这里开始线程

_flag = true;

timeThread = new Thread(ThreadTimer);

timeThread.Start();

}

///

/// 停止线程

///

private void StopThread()

{

_flag = false;

if (timeThread != null) timeThread.Abort();

}

///

/// 线程方法

///

public void ThreadTimer()

{

while (_flag)

{

if (fWeek == "") //按天

{

RunBackup();

}

else

{

// 按周

if (WeekSwitch(fWeek) == DateUtil.getWeek(DateTime.Now) && WeekSwitch(fWeek) != "")

{

RunBackup();

}

}

}

}

///

/// 数据库列表

///

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;

}

}

}

Code

private readonly Dictionary cache =

new Dictionary();

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();

}

///

/// 执行

///

public void Go()

{

day = DateTime.Now.ToString("yyyy-MM-dd");

fWeek = ini.IniReadValue("Task", "Week");

fHour = ini.IniReadValue("Task", "Hour");

RunThread();

}

///

/// 执行线程

///

private void RunThread()

{

//这里开始线程

_flag = true;

timeThread = new Thread(ThreadTimer);

timeThread.Priority = ThreadPriority.Lowest;//设置线程优先级降低系统资源占用

timeThread.Start();

}

///

/// 停止线程

///

private void StopThread()

{

_flag = false;

if (timeThread != null) timeThread.Abort();

}

///

/// 线程方法

///

public void ThreadTimer()

{

while (_flag)

{

Thread.Sleep(1000);//线程阻塞,这样可以降低系统资源占用

if (fWeek == "") //按天

{

RunBackup();

}

else

{

// 按周

if (WeekSwitch(fWeek) == DateUtil.getWeek(DateTime.Now) && WeekSwitch(fWeek) != "")

{

RunBackup();

}

}

}

}

///

/// 数据库列表

///

private DataTable GetTaskList()

{

DataSet ds = new DataSet();

ds.ReadXml(SysUtil.GetMapPath("Db.xml"));

return ds.Tables["DataSet"];

}

private void RunBackup()

{

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)))

{

Console.Write("Execute");

//if (!File.Exists(SysUtil.GetMapPath("Db.xml"))) return;

//StartWork();

//cache[day] = true;

}

}

else

{

if (cache[day] == false)

{

Console.Write("Execute");

//if (!File.Exists(SysUtil.GetMapPath("Db.xml"))) return;

//StartWork();

//cache[day] = true;

}

}

}

}

到这里基本的任务已经完成,代码没有适当的优化。还有一个不完善的GUI管理工具。

http://xiazai.jb51.net/tools/system/Reboot(c#).rar

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值