zoukankan      html  css  js  c++  java
  • .NET 定时执行任务解决方案(Timer & Quartz.Net)

    共有两种方法:

    一。使用Timer

    global.asax

    <%@ Application Language="C#" %>
    <%@ import Namespace="System.IO" %> 
    
    <mce:script runat="server"><!--
    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;
    }
        
        void Application_End(object sender, EventArgs e) 
        {
            //  在应用程序关闭时运行的代码
    
        }
            
        void Application_Error(object sender, EventArgs e) 
        { 
            // 在出现未处理的错误时运行的代码
    
        }
    
        void Session_Start(object sender, EventArgs e) 
        {
            // 在新会话启动时运行的代码
    
        }
    
        void Session_End(object sender, EventArgs e) 
        {
            // 在会话结束时运行的代码。 
            // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
            // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 
            // 或 SQLServer,则不会引发该事件。
    
        }
        private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
        {
            //间隔时间执行某动作
            
            
            //指定日志文件的目录
            string fileLogPath = AppDomain.CurrentDomain.BaseDirectory ;
            string fileLogName = "SoftPrj_CN_" + 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();
            }
    }
    // --></mce:script>

    二,使用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/ 

    网上找了好多教程,但没有一篇是关于如何在ASP.NET中使用的代码。既然它适用于任何的.net程序,当然也就适用于asp.net的web应用。

    (1)在web.config中进行相关配置

        <configSections>
            <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
            <sectionGroup name="common">
                <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
            </sectionGroup>
        </configSections>
        <common>
            <logging>
                <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
                    <arg key="showLogName" value="true"/>
                    <arg key="showDataTime" value="true"/>
                    <arg key="level" value="DEBUG"/>
                    <arg key="dateTimeFormat" value="HH:mm:ss:fff"/>
                </factoryAdapter>
            </logging>
        </common>
        <quartz>
            <add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/>
            <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
            <add key="quartz.threadPool.threadCount" value="10"/>
            <add key="quartz.threadPool.threadPriority" value="2"/>
            <add key="quartz.jobStore.misfireThreshold" value="60000"/>
            <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/>
        </quartz>

    另外我自己加了一个配置项:

        <appSettings>
            <add key="cronExpr" value="0 0 8-17/1 ? * 2-6"/>
        </appSettings>

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

    public class RetrieveAj2003T140Job : Quartz.IJob
    {
        private static DataView aj2003View;
    
        public RetrieveAj2003T140Job()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
         }
    
       
    
        public void Execute(Quartz.JobExecutionContext context)
        {
            //throw new Exception("The method or operation is not implemented.");
            //你的处理逻辑,也就是“工作”
         }
    }

    接口非常简单,只要在Execute()方法中进行逻辑处理就可以了。比如,读取数据库数据,或者是读取电子邮件。

    (3)在Global.asax文件中启动工作调度
    这便于我们在web应用启动时,就启动工作调度。

    <%@ Import Namespace="Quartz" %>
    
    <script runat="server">
    
         IScheduler sched;
        void Application_Start(object sender, EventArgs e) 
        {
            // 在应用程序启动时运行的代码
             ISchedulerFactory sf = new Quartz.Impl.StdSchedulerFactory();
             sched = sf.GetScheduler();
             JobDetail job = new JobDetail("job1", "group1", typeof(RetrieveAj2003T140Job));
    
            string cronExpr = ConfigurationManager.AppSettings["cronExpr"];
             CronTrigger trigger = new CronTrigger("trigger1", "group1", "job1", "group1",cronExpr);
             sched.AddJob(job, true);
             DateTime ft = sched.ScheduleJob(trigger);
             sched.Start();
            
         }
        
        void Application_End(object sender, EventArgs e) 
        {
            //   在应用程序关闭时运行的代码
            if (sched != null)
            {
                 sched.Shutdown(true);
             }
         }
            
    
           
    </script>

    需要注意的是,当Application_End的时候,需要关闭Quartz的工作。

    OK了,可以在ASP.NET中正常使用了。

    摘自:http://hi.baidu.com/jok607/blog/item/4e0c83234c6de743ac34def7.html

  • 相关阅读:
    C# 获取文件名、无后缀文件名、扩展名
    navicat for oracle 导入xlsx文件提示无法打开xlsx文件
    复制的文件不能粘贴到远程的服务器上
    使用.bat 批量将部分文件迁移到新的路径下
    sql sever 查询用户所有的表和各个表数据量
    orecle 查询数量 union合并 的排序问题
    oracle 如何将带有,的一列分成多列
    java中selenium判断某个元素是否存在
    docker安装Ubuntu以及ssh连接
    Java8 将List<JavaBean>中某个属性取出来为单独的一个集合List<String>
  • 原文地址:https://www.cnblogs.com/jasonlny/p/3620344.html
Copyright © 2011-2022 走看看