如何让我们的asp.net程序在某个时刻自动执行某些任务呢?
当我们为桌面程序设计某个计划任务时,一个时钟控件(Timer)就轻而易举地解决了,可我们如何让我们的web程序能具有像时钟控件一样的功能呢?(注:此处的自动执行不是某个用户访问某一页面时才自动执行,而是只要Web服务器正常工作,则无论有没有用户访问都可自动执行某些任务的情况)
吾漫游于搜索引擎间,终得甜头啊~~~
其思路如下:
在Application_Start里面添加一进程,通过while(true)让它陷入执行任务的“死”循环,此死循环非绝对死循环——每当它执行一次任务后,我们就让它沉睡一会,Thread.Sleep(3000)。由此,每隔3秒就可执行一次我们安排的任务,至于任务和执行时间个间隔完全可以“自治”。
Global.asax文件部分源码:
复制代码
复制代码
private void start()
{//调用进程
ThreadStart myThreadStart = new ThreadStart(startJob);
schedulerThread = new Thread(myThreadStart);
schedulerThread.Start();
}
private void startJob()
{//循环执行,间隔3秒
while (true)
{//每隔3秒执行一次
ThreadStart myThreadDelegate = new ThreadStart(excuteJob);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();
Thread.Sleep(3000);
}
}
private void excuteJob()
{
//此处添加需要执行的任务,如备份数据库、发送信息等待
//此处的任务是每隔3秒刷新一次www.goberl.com本站的页面
//==================================================任务开始
WebRequest wres;
String url = "http://www.goberl.com/";
wres = WebRequest.Create(url);
WebResponse wreq = wres.GetResponse();
Encoding code = Encoding.GetEncoding("gb2312");
StreamReader sr1 = new StreamReader(wreq.GetResponseStream(), code);
String strtemp = sr1.ReadToEnd();
sr1.Close();
//==================================================任务结束
//记录执行的次数
int readCount=-2;
using (StreamReader sr = new StreamReader(System.AppDomain.CurrentDomain.BaseDirectory+@"/countRecord.txt"))
{//获取文本文件中的数字
String line;
while (((line = sr.ReadLine()) != null))
{
readCount = Convert.ToInt32(line);
}
}
if (readCount != -2)
{//如果成功读取了文本文件中的数据则是该数字自增1,并写入文本文件
readCount++;
using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"/countRecord.txt", false))
{
sw.Write(readCount.ToString());
}
}
}
public System.Threading.Thread schedulerThread = null;
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
HttpContext.Current.Application.Lock();
HttpContext.Current.Application["TimeStamp"] = DateTime.Now;
HttpContext.Current.Application.UnLock();
start(); //调度
}
源码下载:
download