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<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/2页 12下一页阅读全文

(0)

相关推荐

  • windows下C#定时管理器框架Task.MainForm详解

    入住博客园4年多了,一直都是看别人的博客,学习别人的知识,为各个默默无私贡献自己技术总结的朋友们顶一个:这几天突然觉得是时候加入该队列中,贡献出自己微弱的力量,努力做到每个月有不同学习总结,知识学习的分享文章.以下要分享的是花了两天时间编写+测试的windows下C#定时管理器框架-Task.MainForm. 目的: 随着这五年在几个公司做不同职位的.net研发者,发现各个公司都或多或少会对接一些第三方合作的接口或者数据抓取功能,都是那种各个服务直接没有关联性功能,开发人员也可能不是一个人,使

  • c#定时器使用示例详解

    在C#里关于定时器类就有3个  1.定义在System.Windows.Forms里  2.定义在System.Threading.Timer类里  3.定义在System.Timers.Timer类里 System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API  SetTimer实现的.它的主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台

  • c# 在windows服务中 使用定时器实例代码

    由于最近做自动执行的程序,开始做windows服务程序, 在windows服务中如何使用定时器的时候一直失效, 以前是直接拖入timer控件,但是不能直接运行,后来在网上找了一段程序,好使了. 复制代码 代码如下: //开始事件        protected override void OnStart(string[] args)        {             //定时事件            MyTimer();         } //结束事件        protect

  • C#定时器实现自动执行的方法

    本文实例讲述了C#定时器实现自动执行的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: //下面讲一个打开窗体定时执行按钮的东西 private void Form1_Load(object sender, EventArgs e) { System.Timers.Timer pTimer = new System.Timers.Timer(5000);//每隔5秒执行一次,没用winfrom自带的 pTimer.Elapsed+=pTimer_Elapsed;//委托,要执

  • ASP.NET(C#) 定时执行一段代码

    Global.asax C# code 复制代码 代码如下: <%@ Application Language="C#" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Threading" %> <script runat="server"> string LogPath; Thread t

  • C#多线程学习之(五)使用定时器进行多线程的自动管理

    本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. 初始化一个Timer对象: Timer timer = new Timer(timerDelegate, s,1000, 1000); 第一个参数:指定了TimerCallback 委托,表示要执行的方法: 第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用: 第三个参

  • c#定时运行程序分享(定时程序)

    1)在我们的项目中添加引用文件:TaskSchedulerEngine.dll(dll定义了一个ITask接口,定义了两个方法Initialize和HandleConditionsMetEvent): 2)创建一个定时触发的类:SyncTask.cs(类名自己随便定义),该类必须实现接口 ITask.具体代码如下: 复制代码 代码如下: public class SyncTask : ITask{ //接受传递过来的参数的变量 private string configName;     ///

  • c#定时器和global实现自动job示例

    一.创建一个cs文件,定义Time 对象 复制代码 代码如下: public class WebTimer_AutoRepayment{    static WebTimer_AutoRepayment()    {        _WebTimerTask = new WebTimer_AutoRepayment();    }    /// <summary>    /// 实例化    /// </summary>    /// <returns></ret

  • C#实现判断一个时间点是否位于给定时间区间的方法

    本文实例讲述了C#实现判断一个时间点是否位于给定时间区间的方法.分享给大家供大家参考.具体如下: 本文中实现了函数 复制代码 代码如下: static bool isLegalTime(DateTime dt, string time_intervals); 给定一个字符串表示的时间区间time_intervals: 1)每个时间点用六位数字表示:如12点34分56秒为123456 2)每两个时间点构成一个时间区间,中间用字符'-'连接 3)可以有多个时间区间,不同时间区间间用字符';'隔开 例

  • C# 定时器定时更新的简单实例

    如下所示: 复制代码 代码如下: class Program     { static void Main(string[] args)         {             //for (int i = 0; i < 100; i++)             //{ //    SendMessage("13161626306", "13161626306");             //}             System.Timers.Ti

随机推荐