asp.net自動執行任務-解決應用池回收問題

在複雜的業務應用程序中,有時候會要求一個或者多個任務在一定的時間或者一定的時間間隔內計劃進行,比如定時備份或同步數據庫,定時發送電子郵件,定期處理用戶狀態信息,支付系統中定期同步異常賬單等等,我們稱之爲計劃任務。實現計劃任務的方法也有很多,可以采用SQLAgent執行存儲過程,采用Windows任務調度程序來實現,也可以使用Windows服務來完成我們的計劃任務,這些方法都是不錯的解決方案。但是,以上這些都需要有服務器的權限才能進行,而對于虛擬主機客戶使用的Web應用程序來說,這些方法實現起來並不是很簡單的,主機服務提供商或者不能直接提供這樣的服務,或者需要你支付許多額外的費用。 看過一些這方面的文章,發現有一個共同的缺點:IIS運行到一定時期,計劃任務就停止了。查找原因發現是IIS的應用程序池定期回收導致計劃任務停止。本文的這個方法可以解決應用程序池回收問題。

請看代碼:

Global.asax.cs

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.SessionState;

using System.Timers;

using System.Net;

using System.IO;

using System.Text;

using System.Threading;

//手機主題 http://www.qumiao.com

//Email:haolinks#163.com

//Author:漫步甜蜜

namespace qumiao.com

{

public class Global : System.Web.HttpApplication

{

protected void Application_Start(object sender, EventArgs e)

{

//定義定時器

System.Timers.Timer myTimer = new System.Timers.Timer(5000);

myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);

myTimer.Enabled = true;

myTimer.AutoReset = true;

}

void myTimer_Elapsed(object source, ElapsedEventArgs e)

{

try

{

Log.SaveNote(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":AutoTask is Working!");

YourTask();

}

catch (Exception ee)

{

Log.SaveException(ee);

}

}

void YourTask()

{

//在這裏寫你需要執行的任務

}

protected void Application_End(object sender, EventArgs e)

{

Log.SaveNote(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":Application End!");

//下面的代碼是關鍵,可解決IIS應用程序池自動回收的問題

Thread.Sleep(1000);

//這裏設置你的web地址,可以隨便指向你的任意一個aspx頁面甚至不存在的頁面,目的是要激發Application_Start

//string url = "http://www.qumiao.com";手機主題

string url = "http://localhost:82/111.aspx";

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);

HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回寫的字節流

}

}

}

原理:Global.asax 可以是asp.net中應用程序或會話事件處理程序,我們用到了Application_Start(應用程序開始事件)和Application_End(應用程序結束事件)。當應用程序開始時,啓動一個定時器,用來定時執行任務YourTask()方法,這個方法裏面可以寫上需要調用的邏輯代碼,可以是單線程和多線程。當應用程序結束時,如IIS的應用程序池回收,讓asp.net去訪問當前的這個web地址,本地測試的時候寫本地地址,如http://localhost:82/111.aspx,到正式生産環境,可以改成你的web地址,如手機主題http://www.qumiao.com http://www.devdao.com等。這裏需要訪問一個aspx頁面,這樣就可以重新激活應用程序。Log類是一個記錄日志的一個類,下面是測試時生成的日志信息:

================================================================

2008-10-30 17:46:10:AutoTask is Working!

2008-10-30 17:46:15:AutoTask is Working!

2008-10-30 17:46:20:AutoTask is Working!

2008-10-30 17:46:23:Application End!

2008-10-30 17:46:29:AutoTask is Working!

2008-10-30 17:46:34:AutoTask is Working!

從日志中發現,當手動回收IIS的應用程序池之後,計劃任務還在執行,說明我們的目的達到了。

如果將Application_End中的代碼注釋掉,會發現Application End之後,計劃任務停止工作了,如下:

================================================================

2008-10-30 18:01:34:AutoTask is Working!

2008-10-30 18:01:39:AutoTask is Working!

2008-10-30 18:01:44:AutoTask is Working!

2008-10-30 18:01:46:Application End!

局限性:可以解決應用程序池自動或者手動回收,但是無法解決IIS重啓或者web服務器重啓的問題,當然這種情況出現的時候不多,而且如果有人訪問你的網站的時候,又會自動激活計劃任務了。

代碼下載:http://www.qumiao.com/down/autotask.rar

一點小小的經驗與大家分享,歡迎大家改進和轉載。做爲對作者的鼓勵,希望保留版權信息,不勝感激!

解決ASP.NET網頁出現的亂碼問題
  今天,用javascript腳本做了一個ASP.NET頁面中的菜單工具,保存爲menuScript.js.  在頁面中用<script language="javascript" src="http://img.sxsky.net/it/../js/MenuScript.js"></script>調用, ...查看完整版>>解決ASP.NET網頁出現的亂碼問題
 
asp.net察看項目的兩個問題解決方法
今天拿到老師要看的他們以前完成的項目,是用asp.net開發的。但是我的vs2003打開這個項目時出現了2個問題,一個是不能打開解決方案,一個是打開了解決方案,但是不能察看.aspx文件的“設計視圖”。察看msdn不能很好好...查看完整版>>asp.net察看項目的兩個問題解決方法
 
解決 ASP.NET 中目錄訪問權限的問題
症狀:從 ASP.NET 應用程序,訪問遠程增強安全性的資源時可能會收到以下錯誤信息 登錄失敗:未知用戶名或錯誤密碼。解決辦法: 1 在 Web 服務器上修改 ASPNET 帳戶的密碼爲 password 。 2 在遠程...查看完整版>>解決 ASP.NET 中目錄訪問權限的問題
 
ASP.NET和Oracle連接問題的解決方法
  不少人在做ASP.NET+Oracle開發的時候都會碰到連接問題,提示“Unable to load DLL (oci.dll)”,但這個文件在系統中是存在的,很多人爲此焦頭爛額,我看到很多的帖子都是求助這個問題的。其實並非所有的人都會碰...查看完整版>>ASP.NET和Oracle連接問題的解決方法
 
ASP.Net防止刷新自動觸發事件的解決方案
  使用asp.net,在刷新頁面的時候會自動觸發服務器端的事件。舉個簡單的例子,如:一個注冊頁面,我們填寫完注冊信息之後,如果按F5刷新之後,會自動觸發到Button事件上,這樣就造成了又注冊了一次的麻煩。  我先...查看完整版>>ASP.Net防止刷新自動觸發事件的解決方案
 
Asp.Net控件加載錯誤的解決方法
開發基于Asp.Net的系統,最初使用R.a.d Treeview 2.5,經常會出現控件無法加載的情況。原以爲是控件本身的問題,可後來將R.a.d Treeview升級到3.0版,還是無法解決。去Terelik官方網站看了F.A.Q,也沒有提到這個問題...查看完整版>>Asp.Net控件加載錯誤的解決方法
 
技術應用-asp.net加密方法
  本文由chenyangasp版權所有,可以轉載,複制,粘貼,並請注明出處,但不得修改!  無論什麽時候只要我們使用數據庫開發網站,我們就必須保護用戶資料,這非常必要。  黑客可以盜竊口令,個人隱私遭到嚴重的破...查看完整版>>技術應用-asp.net加密方法
 
ASP.net隨機數應用實例
大家可能都用過Chinaren的校友錄,不久前它的留言簿上加了一個防止灌水的方法,就是系統每次産生一個由隨機的數字和字母組成的圖片,每次留言必須正確地輸入這些隨機産生的字符,否則不能添加留言。這是一個很好...查看完整版>>ASP.net隨機數應用實例
 
ASP.NET數據庫應用指南
  對于一個熟練的ASP開發者來說,ASP的數據庫應用不但簡單,而且功能還很強大。很多WEB開發者就是因爲這一點而選擇ASP的,至今爲止,他們一直認爲ASP數據庫功能還不錯,完全可以滿足開發要求。但是,對于一個剛剛學...查看完整版>>ASP.NET數據庫應用指南
 
 
回到王朝網路移動版首頁