mvc 保證定時器回收限制
在項目中我們或多或少的遇到一些需要定時觸發或者計算的東西,這個時候我們就需要定時器來作為解決方案。非常好思路清晰,業務邏輯完好,定時器也開好了,
當我們信心滿滿的掛到IIS服務器的時候,發現寫的定時器在運行了一段時間之後就不在運行了。
問題分析:
難道是我們的代碼寫錯了嗎?不是的,如果寫錯了怎麽又會正常運行幾次哪。那問題出在哪裏拉,沒有錯問題在於IIS的程序池。
定時器與閑時超時的沖突:
首先我們分析原因一:沒有錯你沒有看錯,IIS還有一個顯示超時設置,他會被回收程序池進程。系統一般默認的時間為20分鐘,所有也就是說我們的程序如果
5分鐘一次也就運行4次就停止掉了。用過Quartz定時任務的小夥伴們都知道吧(深受其苦)。知道是這個東西搗的鬼那就修改他,
方法一:修改他的值,但是很不幸,它最大值也就1740分鐘。也就是下面說的第二個問題了,耐心等待。
方法二:不讓他閑時超時,所謂的閑時超時就是此網站多少時間沒有人訪問工作,那你就可以一直訪問他,長時間開啟一個機器,寫一個對此網站的時間小於
閑時超時時間的輪詢吧。
程序池的限制:
程序池存在時間限制,我們通過IIS---->引用程序池---->高級設置---->找到回收會發現固定時間間隔為1740.這裏就是上面說的顯示超時最大時長了。
這是IIS自己的功能,那麽又有人說那我把他設置為0(嘿嘿),我個人理解就是你設置為0也不是不回收而是不為固定時間間隔回收。下面附上代碼解決方案。
解決程序池回收:
找到原因那就可以對癥下藥了,既然是自動回收了,那我們只要阻止程序池的自動回收就好了嗎?
1 protected void Application_End(object sender, EventArgs e) 2 { 3 //下面的代碼是關鍵,可解決IIS應用程序池自動回收的問題4 Thread.Sleep(1000); 5 //這裏設置你的web地址,可以隨便指向你的任意一個aspx頁面甚至不存在的頁面,目的是要激發Application_Start <br> 6 //我這裏是一個驗證token的地址。 7 string url = System.Configuration.ConfigurationManager.AppSettings["tokenurl"]; 8 HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 9 HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();10 Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回寫的字節流 11 }
原理:程序池回收中會觸發Application_End事件,在此事件中重新請求網站任意地址,相當於重新激活該網站防止回收。
mvc 保證定時器回收限制