您好,登錄后才能下訂單哦!
之前的一個項目中使用System.Threading.Timer對象時有沒有遇到IIS釋放Timer對象的問題。說實話之前真沒遇到過這個問題,就是說我之前定義的timer對象沒有釋放,運行正常,回來后我就百度尋找這方面得信息,原來IIS在運行WebApp時對于非靜態資源都是自動釋放,而我回頭看了看之前寫的Web程序,很幸運當時是這么寫的:
Global.asax文件
private static Timer time; //System.Threading; private static Log log; protected void Application_Start(object sender, EventArgs e) { log = new Log(); log.Write(ref time, 5000); }
Log.cs內代碼:
class Log{ public void Write(ref Timer time,int flashTime) { if (time == null) { time = new Timer(new TimerCallback(DoExecution), this, 0, flashTime); } } void DoExecution(object obj) { //定時執行代碼 } }
也就是說把timer對象定義成全局靜態對象就不會被IIS所釋放,如果當時不這么寫,肯定會在出錯時郁悶好一陣。不過現在知識面廣了,定時執行任務可以使用Quartz.net開源組件,他封裝了Time對象,可以使任務的執行更穩定,下面給出示例代碼:
public class TimeJob:Quartz.IJob { public void Execute(Quartz.JobExecutionContext context) { //需要定時執行的代碼。。。 } } public class Global : System.Web.HttpApplication { private static Timer time ; protected void Application_Start(object sender, EventArgs e) { //定義任務 Quartz.JobDetail job = new Quartz.JobDetail("job1", "group1", typeof(TimeJob)); //定義觸發器 Quartz.Trigger trigger = Quartz.TriggerUtils.MakeSecondlyTrigger(5);//5秒執行 trigger.Name = "trigger1"; trigger.JobGroup = "group1"; trigger.JobName = "job1"; trigger.Group = "group1"; //定義計劃著 Quartz.ISchedulerFactory sf = new Quartz.Impl.StdSchedulerFactory(); Quartz.IScheduler sch = sf.GetScheduler(); sch.AddJob(job, true);//添加任務 sch.ScheduleJob(trigger);//添加計劃者 sch.Start();//開始執行 } }
以上代碼也是在Global.asax文件中定義的。
最后一貫的作風:歡迎各位大牛拍磚~~~
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。