c#一個(gè)定時(shí)重啟的小程序?qū)崿F(xiàn)代碼第1/2頁
更新時(shí)間:2008年09月20日 13:05:42 作者:
今天有個(gè)朋友找我問有沒有一些能像Windows一樣計(jì)劃任務(wù)重啟的軟件,我也不清楚。他它說能讓我做一個(gè)給他它么?我考慮了一下,他的服務(wù)器都是有安裝.NET框架的,那可以用.NET來使下~~!
原理我像大家都很清楚,這里只說.NET(c#實(shí)現(xiàn))。服務(wù)器每次啟動或者重啟,都是沒登陸的。那意味著啟動項(xiàng)里不只能做,我就考慮到使用Windows服務(wù)。Windows服務(wù)在系統(tǒng)加載時(shí)候就會啟動所有服務(wù),把程序?qū)戇M(jìn)里面應(yīng)該沒錯(cuò)了。
需要重啟,那就要一個(gè)時(shí)間來效驗(yàn),寫法都有很多。我這里采用ini來存放。
Time 記錄要重啟的時(shí)間,驗(yàn)證時(shí)間。
Day 用來累加天數(shù)。
[Reboot]
Time=02:02:01
Day=3
使用System.Timers.Timer循環(huán)驗(yàn)證時(shí)間(不知道始終對占用資源是否會太大)
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") == retime)
{
Shoutdown.DoExitWin(0x00000002);
}
}
服務(wù)首次啟動初始化重啟的時(shí)間以及天數(shù),初始化時(shí)候讀取ini文件,把時(shí)間放進(jìn)變量里,將天數(shù)累加3天。(減少讀寫I/O的開銷)
始終不停的循環(huán)驗(yàn)證。
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();
}
這里可以改造成用線程來做,我想應(yīng)該比這個(gè)會好。
放出一段自動備份SQLSERVER的代碼端,將后會發(fā)布。
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>
/// 執(zhí)行
/// </summary>
public void Go()
{
day = DateTime.Now.ToString("yyyy-MM-dd");
fWeek = ini.IniReadValue("Task", "Week");
fHour = ini.IniReadValue("Task", "Hour");
RunThread();
}
/// <summary>
/// 執(zhí)行線程
/// </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>
/// 數(shù)據(jù)庫列表
/// </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;
}
}
}
需要重啟,那就要一個(gè)時(shí)間來效驗(yàn),寫法都有很多。我這里采用ini來存放。
Time 記錄要重啟的時(shí)間,驗(yàn)證時(shí)間。
Day 用來累加天數(shù)。
復(fù)制代碼 代碼如下:
[Reboot]
Time=02:02:01
Day=3
使用System.Timers.Timer循環(huán)驗(yàn)證時(shí)間(不知道始終對占用資源是否會太大)
復(fù)制代碼 代碼如下:
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") == retime)
{
Shoutdown.DoExitWin(0x00000002);
}
}
服務(wù)首次啟動初始化重啟的時(shí)間以及天數(shù),初始化時(shí)候讀取ini文件,把時(shí)間放進(jìn)變量里,將天數(shù)累加3天。(減少讀寫I/O的開銷)
始終不停的循環(huán)驗(yàn)證。
復(fù)制代碼 代碼如下:
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();
}
這里可以改造成用線程來做,我想應(yīng)該比這個(gè)會好。
放出一段自動備份SQLSERVER的代碼端,將后會發(fā)布。
復(fù)制代碼 代碼如下:
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>
/// 執(zhí)行
/// </summary>
public void Go()
{
day = DateTime.Now.ToString("yyyy-MM-dd");
fWeek = ini.IniReadValue("Task", "Week");
fHour = ini.IniReadValue("Task", "Hour");
RunThread();
}
/// <summary>
/// 執(zhí)行線程
/// </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>
/// 數(shù)據(jù)庫列表
/// </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;
}
}
}
相關(guān)文章
C#中TreeView實(shí)現(xiàn)適合兩級節(jié)點(diǎn)的選中節(jié)點(diǎn)方法
這篇文章主要介紹了C#中TreeView實(shí)現(xiàn)適合兩級節(jié)點(diǎn)的選中節(jié)點(diǎn)方法,實(shí)例分析了C#中TreeView節(jié)點(diǎn)操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09WinForm實(shí)現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能
這篇文章主要介紹了WinForm實(shí)現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能,是非常實(shí)用的功能,需要的朋友可以參考下2014-08-08在C#項(xiàng)目中調(diào)用C++編寫的動態(tài)庫的三種方式
這篇文章給大家介紹了三種方式詳解如何在C#項(xiàng)目中調(diào)用C++編寫的動態(tài)庫,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-01-01教你創(chuàng)建一個(gè)帶診斷工具的.NET鏡像
本文編寫的初衷是因?yàn)樵谌豪镉泻芏嘈』锇橛龅缴a(chǎn)環(huán)境性能問題的時(shí)候,.NET的runtime鏡像中沒有帶一些工具,安裝和使用起來很麻煩,所以分享一些我們公司內(nèi)部一些技巧,對.NET鏡像帶診斷工具相關(guān)知識感興趣的朋友一起看看吧2022-07-07C#獲取兩個(gè)時(shí)間的時(shí)間差并去除周末(取工作日)的方法
這篇文章主要介紹了C#獲取兩個(gè)時(shí)間的時(shí)間差并去除周末(取工作日)的方法,可有效的實(shí)現(xiàn)獲取工作日的功能,涉及C#時(shí)間操作的相關(guān)技巧,需要的朋友可以參考下2015-05-05