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

  • 相关阅读:
    PHP 大小写转换、首字母大写、每个单词首字母大写转换相关函数
    【论文学习4】BiSample: Bidirectional Sampling for Handling Missing Data with Local Differential Privacy
    【论文学习3】Local Differential Privacy for Deep Learning
    【论文学习2】 Differential Privacy Reinforcement Learning
    深度学习中的优化算法
    Spatial crowdsourcing
    “pip install tensorflow ”出现错误
    python或pip'不是内部或外部命令”
    pip install torch出现错误
    打不开gitHub的解决方法
  • 原文地址:https://www.cnblogs.com/jasonlny/p/3620344.html
Copyright © 2011-2022 走看看