共有两种方法:
一。使用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>
<sectionname="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<sectionGroupname="common">
<sectionname="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
</sectionGroup>
</configSections>
<logging>
<factoryAdaptertype="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
<argkey="showLogName" value="true"/>
<argkey="showDataTime" value="true"/>
<argkey="level" value="DEBUG"/>
<argkey="dateTimeFormat" value="HH:mm:ss:fff"/>
</factoryAdapter>
</logging>
</common>
<quartz>
<addkey="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/>
<addkey="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
<addkey="quartz.threadPool.threadCount" value="10"/>
<addkey="quartz.threadPool.threadPriority" value="2"/>
<addkey="quartz.jobStore.misfireThreshold" value="60000"/>
<addkey="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/>
</quartz>
另外我自己加了一个配置项:
<addkey="cronExpr" value="0 0 8-17/1 ? * 2-6"/>
</appSettings>
(2)创建一个普通类,实现Quartz.IJob接口
{
privatestatic DataView aj2003View;
public RetrieveAj2003T140Job()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
publicvoid Execute(Quartz.JobExecutionContext context)
{
//throw new Exception("The method or operation is not implemented.");
//你的处理逻辑,也就是“工作”
}
}
接口非常简单,只要在Execute()方法中进行逻辑处理就可以了。比如,读取数据库数据,或者是读取电子邮件。
(3)在Global.asax文件中启动工作调度
这便于我们在web应用启动时,就启动工作调度。
<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