定时任务-C#线程类 windows服务

Posted 西伯利亚的狼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了定时任务-C#线程类 windows服务相关的知识,希望对你有一定的参考价值。

原理

最常用的就是C#中 timer类写一个定时方法,然后在把他宿主到windows服务里面。

C#中Timer分类

关于C# Timer类  在C#里关于定时器类就有3个

C# Timer使用的方法1.定义在System.Windows.Forms里

C# Timer使用的方法2.定义在System.Threading.Timer类里  "

C# Timer使用的方法3.定义在System.Timers.Timer类里

◆System.Windows.Forms.Timer

应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API  SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console  Application(控制台应用程序)无法使用。   
  
◆System.Timers.Timer

和System.Threading.Timer非常类似,它们是通过.NET  Thread  Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。

◆System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。

System.Threading.Timer

public class BizCommon
{
    /// <summary>
    ////// </summary>
    public static object LockObject = new object();

    public static void StartTime()
    {
        //第二个参数是回调方法的参数
        Timer t = new Timer(StartBiz, null, 0, 5000);
        //t.Change(0, 5000);
    }

    private static void StartBiz(object o)
    {
        if (Monitor.TryEnter(LockObject))
        {
            FileStream fs = new FileStream("C:\\\\log.txt", FileMode.OpenOrCreate);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine("Time:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"));
            sw.Close();
        }
    }
}
View Code

System.Timers.Timer

public class BizCommon
{
    /// <summary>
    ////// </summary>
    public static object LockObject = new object();

    public static void StartTime()
    {
        System.Timers.Timer tm = new System.Timers.Timer();
        tm.Interval = 5000;
        tm.Elapsed += new System.Timers.ElapsedEventHandler(StartBiz);
        tm.AutoReset = true; //执行一次false,一直循环执行true
        tm.Enabled = true;//是否执行Elapsed事件。
        tm.Start();
        //tm.Stop();
    }
    private static void StartBiz(object sender, System.Timers.ElapsedEventArgs e)
    {
        if (Monitor.TryEnter(LockObject))
        {
            FileStream fs = new FileStream("C:\\\\log.txt", FileMode.OpenOrCreate);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine("Time:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"));
            sw.Close();
        }
    }
}
View Code

更多关于多线程的教程请看

http://www.cnblogs.com/wudequn/category/1154929.html

 

public static void StartTime()
{
    System.Timers.Timer tm = new System.Timers.Timer();
    tm.Interval = 1000;
    tm.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
    tm.Start();

}
private static void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    int intHour = e.SignalTime.Hour;
    int intMinute = e.SignalTime.Minute;
    int intSecond = e.SignalTime.Second;
    // 设置 每天 00:00:00开始执行程序  
    //
    //由于计算机性能问题,有时候可能会跳过某一秒,导致没有执行。  这种导致任务没有处理的异常叫做missfire
    //这种就要做很多处理,其他时间段在查看数据库是否今天这个时间处理过。没有处理在重新处理等等 补偿操作。
    if (intHour == 00 && intMinute == 00 && intSecond == 00)
    {
        //do something
    }
}
特定时间点处理任务
Windows服务

创建过程

 

下载项目

编译完之后,里面有安装 和 写在 windows服务的批处理文件。

 

以上是关于定时任务-C#线程类 windows服务的主要内容,如果未能解决你的问题,请参考以下文章

springboot定时任务

详解java定时任务

如何定时重启windows服务

定时任务的实现原理:时间轮算法

定时任务的实现原理:时间轮算法

定时任务多线程的实现