电竞比分网-中国电竞赛事及体育赛事平台

分享

阻止Application

 行走在理想邊緣 2019-03-22

在做項目時,遇到同步ERP數(shù)據(jù)的問題,客戶要求是:程序中,設(shè)置一個開始時間,再設(shè)置一個時間間隔,讓程序每隔一段時間導出銷售記錄,這個開始時間和時間間隔可以手動修改設(shè)定。
     這問題糾纏了我好幾天,總算解決了,寫文檔記錄: 


    首先,要讓程序定時執(zhí)行任務(wù),可以使用ASP.NET中的Timer計時,不過這個定時不是很準,如果用它,還會遇到其他的問題,后面會提到。第二種方法是,使用一個叫做:Quartz.NET開源項目,專門用來調(diào)度定時作業(yè)。


這次項目中,我用到的就是Quartz.NET組件,用他來定時調(diào)度作業(yè),是很方便,不過問題也來了:當程序運行一段時間后,發(fā)現(xiàn)自動任務(wù)停止了。在網(wǎng)上查了查資料,說法不一。   


    后來多方查資料以及自己試驗證明:原來是網(wǎng)站應(yīng)用程序在沒有請求時,過一定的時間就會停止應(yīng)用程序,具體點來說,就是網(wǎng)站中的最后一個session結(jié)束時,網(wǎng)站應(yīng)用程序就會結(jié)束。當然就會觸發(fā)Application_End事件。隨之定時任務(wù)也會停掉。
      
現(xiàn)在的問題就是:如何讓網(wǎng)站都有請求?如何讓Application_End事件不會發(fā)生?


這個問題在網(wǎng)上也有很多種說法,比如有人建議:在Application_End中用程序模擬請求網(wǎng)站,重新開始Application_Start事件,也給出了程序代碼:http:///technology/aspnet-scheduled-tasks-with-quartznet.html這里有詳細說明。不過我照博主的做法,并沒有實現(xiàn)我想要的功能。不過他是用來處理IIS應(yīng)用程序池回收的問題的。
      孟子E章說:新建一個獨立的線程來調(diào)度執(zhí)行的任務(wù),個人認為比較麻煩,沒采用這種方式。


    最后,發(fā)現(xiàn)了一個簡單的處理方式,利用ASP.NET的緩存超時技術(shù)。下面具體來闡明,基本思路:


在應(yīng)用程序啟動時,用程序緩存一個網(wǎng)站中的頁面。在緩存網(wǎng)頁時,設(shè)置好緩存過期時間,以及緩存過期時觸發(fā)的回調(diào)事件,緩存過期時觸發(fā)的回調(diào)事件這是關(guān)鍵。在緩存過期時用程序模擬請求網(wǎng)站頁面,再次緩存,循環(huán)之



代碼說明:(全在Global.asax里)





  1. private const string DummyPageUrl = "http:/index.aspx";  


  2. private const string DummyCacheItemKey = "GagaGuguGigi";  


  3. Quartz.IScheduler sched = SingletonScheduler.GetIntance();  


  4. void Application_Start(object sender, EventArgs e)  


  5. {        


  6.     //緩存頁面  


  7.     RegisterCacheEntry();  


  8. }  



  9. // 注冊一緩存條目在5分鐘內(nèi)到期,到期后觸發(fā)的調(diào)事件  


  10.  private void RegisterCacheEntry()  


  11. {  


  12.     if (null != HttpContext.Current.Cache[DummyCacheItemKey]) return;  


  13.     HttpContext.Current.Cache.Add(DummyCacheItemKey, "Test", null, DateTime.MaxValue,  


  14.         TimeSpan.FromMinutes(5), CacheItemPriority.NotRemovable,  


  15.         new CacheItemRemovedCallback(CacheItemRemovedCallback));  


  16. }  



  17. // 緩存項過期時程序模擬點擊頁面,阻止應(yīng)用程序結(jié)束  


  18.  public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)  


  19. {        


  20.     HitPage();  


  21. }  



  22. // 模擬點擊網(wǎng)站網(wǎng)頁  


  23.  private void HitPage()  


  24. {  


  25.     System.Net.WebClient client = new System.Net.WebClient();  


  26.     client.DownloadData(DummyPageUrl);   


  27. }      


  28. protected void Application_BeginRequest(Object sender, EventArgs e)  


  29. {  


  30.     if (HttpContext.Current.Request.Url.ToString() == DummyPageUrl)  


  31.     {  


  32.         RegisterCacheEntry();  


  33.     }  


  34. }  






 
  這樣,網(wǎng)站應(yīng)用程序就可以像運行windows服務(wù)一樣,在后臺默默的執(zhí)行了,沒看明白,可以參見這里:http://www./KB/aspnet/ASPNETService.aspx
附:Quartz.Net詳細教程參見:
①官方教程:http://quartznet./tutorial/index.html;
②中文翻譯:http://www.cnblogs.com/shanyou/category/102991.html




 ====================================2013-8-2  后記================================================


在WebForm中使用Quartz.Net組件,個人測試結(jié)果,感覺也不夠穩(wěn)定,最終是由 Winform客戶端程序+Quartz.NET組件實現(xiàn),程序一直放在服務(wù)器上跑著。


為了防止服務(wù)器端程序停掉,可以寫成windows服務(wù),這樣服務(wù)器一啟動,就會執(zhí)行任務(wù),只要服務(wù)器沒停,程序也會一直運行。


當然,這只能適用于獨立主機,虛擬空間就不行了。


附:


1.如何編寫windows服務(wù):


http://msdn.microsoft.com/zh-cn/library/vstudio/9k985bc9.aspx


http://www.cnblogs.com/tuyile006/archive/2006/11/27/573654.html


2.windows服務(wù)輔助類:http://blog.csdn.net/a497785609/article/details/9103129



-----------------------------------------


設(shè)計IIS的解決方法



1.長期無用戶訪問網(wǎng)頁,asp.net 會自動進入Application_End事件(時間長短可以配置IIS) 
2.修改web.config文件
3.刪除該站點下的文件夾之后,會自動進入Application_End
4.修改了bin目錄下的文件
5.重啟IIS


以上幾條都會觸發(fā)Application_End事件,如果你在asp.net的Application_State事件里做了一下應(yīng)用(比如說定時器的計劃任務(wù))Application_End事件可能會使定時器停止。想要避免這種情況的發(fā)送就要注意要上面的幾個條件和修改IIS設(shè)置了。



IIS7  上可以通過設(shè)置應(yīng)用程序池參數(shù)使其不會被簡單的自動回收來避免觸發(fā)Application_End事件。


在IIS中找到這個站點所用的程序池,點擊“高級設(shè)置...” 在打開的列表中更改以下設(shè)置: 
回收——固定時間間隔(分鐘) 改為 0         
 ——虛擬/專用內(nèi)存限制(KB) 改為 0 
進程模型——閑置超時(分鐘) 改為 0

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多