時(shí)候會(huì)要求一個(gè)或者多個(gè)任務(wù)在一定的時(shí)間或者一定的時(shí)間間隔內(nèi)計(jì)劃進(jìn)行,比如定時(shí)備份或同步數(shù)據(jù)庫(kù),定時(shí)發(fā)送電子郵件,定期處理用戶狀態(tài)信息,支付系統(tǒng)中定期同步異常賬單等等,我們稱之為計(jì)劃任務(wù)。實(shí)現(xiàn)計(jì)劃任務(wù)的方法也有很多,可以采用SQLAgent執(zhí)行存儲(chǔ)過(guò)程,采用Windows任務(wù)調(diào)度程序來(lái)實(shí)現(xiàn),也可以使用Windows服務(wù)來(lái)完成我們的計(jì)劃任務(wù),這些方法都是不錯(cuò)的解決方案。但是,以上這些都需要有服務(wù)器的權(quán)限才能進(jìn)行,而對(duì)于虛擬主機(jī)客戶使用的Web應(yīng)用程序來(lái)說(shuō),這些方法實(shí)現(xiàn)起來(lái)并不是很簡(jiǎn)單的,主機(jī)服務(wù)提供商或者不能直接提供這樣的服務(wù),或者需要你支付許多額外的費(fèi)用。 看過(guò)一些這方面的文章,發(fā)現(xiàn)有一個(gè)共同的缺點(diǎn):IIS運(yùn)行到一定時(shí)期,計(jì)劃任務(wù)就停止了。查找原因發(fā)現(xiàn)是IIS的應(yīng)用程序池定期回收導(dǎo)致計(jì)劃任務(wù)停止。本文的這個(gè)方法可以解決應(yīng)用程序池回收問(wèn)題。
請(qǐng)看代碼:
protected void Application_Start(object sender, EventArgs e) void myTimer_Elapsed(object source, ElapsedEventArgs e) void YourTask()
//下面的代碼是關(guān)鍵,可解決IIS應(yīng)用程序池自動(dòng)回收的問(wèn)題 原理:Global.asax 可以是asp.net中應(yīng)用程序或會(huì)話事件處理程序,我們用到了Application_Start(應(yīng)用程序開(kāi)始事件)和Application_End(應(yīng)用程序結(jié)束事件)。當(dāng)應(yīng)用程序開(kāi)始時(shí),啟動(dòng)一個(gè)定時(shí)器,用來(lái)定時(shí)執(zhí)行任務(wù)YourTask()方法,這個(gè)方法里面可以寫上需要調(diào)用的邏輯代碼,可以是單線程和多線程。當(dāng)應(yīng)用程序結(jié)束時(shí),如IIS的應(yīng)用程序池回收,讓asp.net去訪問(wèn)當(dāng)前的這個(gè)web地址,本地測(cè)試的時(shí)候?qū)懕镜氐刂罚?A href="http://localhost:82/111.aspx">http://localhost:82/111.aspx,到正式生產(chǎn)環(huán)境,可以改成你的web地址,如手機(jī)主題:http://www.等。這里需要訪問(wèn)一個(gè)aspx頁(yè)面,這樣就可以重新激活應(yīng)用程序。Log類是一個(gè)記錄日志的一個(gè)類,下面是測(cè)試時(shí)生成的日志信息: 局限性:可以解決應(yīng)用程序池自動(dòng)或者手動(dòng)回收,但是無(wú)法解決IIS重啟或者web服務(wù)器重啟的問(wèn)題,當(dāng)然這種情況出現(xiàn)的時(shí)候不多,而且如果有人訪問(wèn)你的網(wǎng)站的時(shí)候,又會(huì)自動(dòng)激活計(jì)劃任務(wù)了。 |
|
來(lái)自: 實(shí)力決定地位 > 《IIS》