.NET 定时执行写日志任务解决方案(Timer & Quartz.Net)

共有两种方法:

 

 

一。使用Timer

 

 

Global.asax.cs代码:

 

 

引入命名空间:  System.IO;

 


protected void Application_Start(object sender, EventArgs e)
{                     
            System.Timers.Timer myTimer = new System.Timers.Timer(10000);
            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
            myTimer.Interval = 10000;
            myTimer.Enabled = true;  
  }
private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
        {
                
            //指定日志文件的目录  
           string fileLogPath = AppDomain.CurrentDomain.BaseDirectory;
           string fileLogName = "LogProjectTest_" + DateTime.Now.ToLongDateString() + "_log.txt";
            /定义文件信息对象  
            FileInfo finfo = new FileInfo(fileLogPath + fileLogName);
            //创建只写文件流  
            using (FileStream fs = finfo.OpenWrite())
           {
               //根据上面创建的文件流创建写数据流  
                StreamWriter strwriter = new StreamWriter(fs);
                //设置写数据流的起始位置为文件流的末尾  
               strwriter.BaseStream.Seek(0, SeekOrigin.End);
               //写入错误发生时间  
                strwriter.WriteLine("发生时间: " + DateTime.Now.ToString());
              //写入日志内容并换行  
                strwriter.WriteLine("错误内容: " + message);  
                strwriter.WriteLine("错误内容: ");
               //写入间隔符  
                strwriter.WriteLine("---------------------------------------------");
                strwriter.WriteLine();
                //清空缓冲区内容,并把缓冲区内容写入基础流  
               strwriter.Flush();
                //关闭写数据流  
                strwriter.Close();
                fs.Close();
           }
        }  

二,使用Quartz.Net


 

Quartz是一个Java开源的作业调度框架。官方网站http://www.opensymphony.com/quartz/


IBM网站上有一篇简单易懂的文章:http://www.ibm.com/developerworks/cn/java/j-quartz/

Quartz.net是从java版本移植到.net版本的。官方网站:http://quartznet.sourceforge.net/



具体代码如下:
1.在项目添加引用:
  Quartz.dll
  Common.Logging.dll
2.

创建一个普通类,实现Quartz.IJob接口



using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Quartz;
using System.IO;
namespace EMailShechelTest
{
    public class WriteLogJob:IJob
    {
        public void Execute(JobExecutionContext context)
        {
          
            string fileLogPath = AppDomain.CurrentDomain.BaseDirectory;
            string fileLogName = "LogProject_" + DateTime.Now.ToLongDateString() + "_log.txt";
       
            FileInfo finfo = new FileInfo(fileLogPath + fileLogName);
            //创建只写文件流  
            using (FileStream fs = finfo.OpenWrite())
            {
                //根据上面创建的文件流创建写数据流  
                StreamWriter strwriter = new StreamWriter(fs);
                //设置写数据流的起始位置为文件流的末尾  
                strwriter.BaseStream.Seek(0, SeekOrigin.End);
                //写入错误发生时间  
                strwriter.WriteLine("发生时间: " + DateTime.Now.ToString());
                //写入日志内容并换行  
                //strwriter.WriteLine("错误内容: " + message);  
                strwriter.WriteLine("错误内容: ");
                //写入间隔符  
                strwriter.WriteLine("---------------------------------------------");
                strwriter.WriteLine();
                //清空缓冲区内容,并把缓冲区内容写入基础流  
                strwriter.Flush();
                //关闭写数据流  
                strwriter.Close();
                fs.Close();
            }
        }
    }
}


3.定义一个执行任务调度的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Quartz;
using Quartz.Impl;
namespace EMailShechelTest
{
    public   class WriteLogScheduler
    {
        static ISchedulerFactory _sf = new StdSchedulerFactory();
        static IScheduler _sched = _sf.GetScheduler();
        
        static WriteLogScheduler _instance=null;
        static object lockObj=new object ();
        public static WriteLogScheduler Instance
        {
            get
            {                
                if (_instance == null)
                {
                    lock (lockObj)
                    {
                        if (_instance == null)
                        {                          
                            _instance = new WriteLogScheduler();
                        }
                    }
                }
                return _instance;
            }
        }
        public void Start()
        {
            JobDetail job = new JobDetail("WriteLog", "Log", typeof(WriteLogJob));
            DateTime start = TriggerUtils.GetNextGivenSecondDate(null, 5);
            TimeSpan interval = TimeSpan.FromSeconds(10);
            Trigger trigger = new SimpleTrigger("WriteLog", "Log", "WriteLog", "Log", start, null, 10, interval);

            _sched.AddJob(job, true);
            DateTime dt = _sched.ScheduleJob(trigger);
            _sched.Start();
        }
        public void Stop()
        {
            _sched.Shutdown(true);
        }
    }
}

4.在Global.asax.cs代码

protected void Application_Start(object sender, EventArgs e)
        {          
            WriteLogScheduler.Instance.Start();
        }

protected void Application_End(object sender, EventArgs e)
        {           
            WriteLogScheduler.Instance.Stop();
        }

转载于:https://www.cnblogs.com/AaronWu/archive/2012/09/21/2697162.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值