天天看點

伺服器定時重新開機小程式,c#一個定時重新開機的小程式實作代碼第1/2頁

原理我像大家都很清楚,這裡隻說.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;

}

}

}