03月27th

实现Web应用程序定时开启任务 -c#应用

DIY编程技术1893℃我来说两句!

         由于ASP.NET站点是作为Web应用程序运行的,它并不受线程的限制,因此我们可以非常方便地在Application_Start和Application_End事件中建立和销毁一个计划任务。

ASP.NET   框架应用程序在第一次向服务器发出请求时创建,在此之前,不执行   ASP.NET 代码。当第一个请求发出后,将创建一个  HttpApplication   实例池并引发   Application_Start   事件。
HttpApplication  实例处理该请求以及后面的请求,直到最后一个实例退出并引发   Application_End   事件。

IIS应用池回收造成Application_Start中定时执行程序停止的问题的解决方法

原理就是在应用程序结束时发出一个Web请求访问网站,启动Application_Start。

 Application_End( sender, EventArgs e) 
{ System.Threading.Thread.Sleep();  strUrl = ; System.Net.HttpWebRequest _HttpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(strUrl); System.Net.HttpWebResponse _HttpWebResponse = (System.Net.HttpWebResponse)_HttpWebRequest.GetResponse(); System.IO.Stream _Stream = _HttpWebResponse.GetResponseStream();}
下面就简单介绍一下在Web站点实现计划任务的方法。我们的例子是定时往文件里添加信息,作为例子,这里把当前的时间定时地写入文件中。


一个计划任务的工作单元称之为一个任务(Job),下面的代码描述了对所有任务都可以被调度引擎计划执行的一个通用的接口,这里的每个任务实现了Execute方法,供调度引擎进行调用:

publicinterface ISchedulerJob
{
voidExecute();
}

如前所述,我们的例子是实现往文件写如字符日期,下面就是实现这一任务的方法:

  SampleJob : ISchedulerJob
{  Execute(){ p = ; FILE_NAME = p+ ; c = System.DateTime.Now.ToString(); flag = ; (!File.Exists(FILE_NAME)){flag = ;StreamWriter sr = File.CreateText(FILE_NAME);sr.Close();}StreamWriter x =  StreamWriter(FILE_NAME,,System.Text.Encoding.Default);(flag) x.Write();x.Write(+c);x.Close();}}
接下来,我们建立一个配置对象,告诉调度引擎执行什么任务和执行的时间间隔。
  SchedulerConfiguration{  sleepInterval; ArrayList jobs =  ArrayList();  SleepInterval {  {  sleepInterval; } } ArrayList Jobs {  {  jobs; } } SchedulerConfiguration( newSleepInterval){sleepInterval = newSleepInterval;}}
下面就是调度引擎,定时执行配置对象的任务
  Scheduler
{ SchedulerConfiguration configuration = ; Scheduler(SchedulerConfiguration config){configuration = config;}  Start(){(){(ISchedulerJob job  configuration.Jobs){ThreadStart myThreadDelegate =  ThreadStart(job.Execute);Thread myThread =  Thread(myThreadDelegate);myThread.Start();Thread.Sleep(configuration.SleepInterval);}}}}
所有的准备工作已经完成,下面就是激活引擎的工作了。为了让我们的任务计划执行,我们在Global.asax.cs文件里的Applicatio_Start和Application_End里进行建立和销毁工作,首先建立一个调度进程运行的线程,我们这里的运行间隔时间为3秒钟。
 System.Threading.Thread schedulerThread = ;
  Application_Start(Object sender, EventArgs e){SchedulerConfiguration config =  SchedulerConfiguration(*);config.Jobs.Add( SampleJob());Scheduler scheduler =  Scheduler(config);System.Threading.ThreadStart myThreadStart =  System.Threading.ThreadStart(scheduler.Start);System.Threading.Thread schedulerThread =  System.Threading.Thread(myThreadStart);schedulerThread.Start();}
最后还需要在程序退出时进行销毁:
  Application_End(Object sender, EventArgs e){ ( != schedulerThread){schedulerThread.Abort();}}
好了,在VS.NET里建立一个C#的Web应用程序工程,建立TaskScheduler.cs类,并修改相应的Global.asax.cs文件。为了能看到效果,我们再建立一个表单WebForm1.aspx,定时刷新来检查我们所记录的数据:

<%@Page language="c#" Codebehind="WebForm1.aspx.cs"AutoEventWireup="false"
Inherits="CSTest.WebForm1" %>
<!DOCTYPE HTMLPUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>在Web应用程序中执行计划任务的例子</title>
<metahttp-equiv="refresh" content="10">
<meta name="GENERATOR"Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE"Content="C#">
<meta name="vs_defaultClientScript"content="JavaScript">
<meta name="vs_targetSchema"content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<bodyMS_POSITIONING="GridLayout">
<form id="Form1" method="post"runat="server">
<iframe style="width:100%;height:100%"src="/SchedulerJob/SchedulerJob.txt"></iframe>
</form>
</body>
</HTML>

本文出自:DIY博客园,链接:https://www.diybloghome.com/prology/176.html,转载请注明!