成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET框架中的可復(fù)用類庫ESBasic

開發(fā) 后端
本文描述了.NET框架中的可復(fù)用類庫,ESBasic中的ICycleEngine的用法。如果你的系統(tǒng)不需要精確的定時任務(wù),而且又不想花費(fèi)過多的精力去防范使用Timer時線程耗盡的窘境出現(xiàn),這種方法很合適。

1.緣起:

有些系統(tǒng)需要每隔一段時間就執(zhí)行一下某個動作,比如,一個監(jiān)控系統(tǒng)每隔10秒鐘就要檢測一下被監(jiān)控對象的狀態(tài)是否正常,那這時我們就可以用到循環(huán)引擎了。

有人說可以使用.NET框架自帶定時器如System.Threading.Timer,嗯,沒錯。但是若這個類使用不當(dāng)可能會引發(fā)后臺池線程耗盡的后果。因為Timer的定時事件觸發(fā)實在后臺線程池中的某個線程中處理的。也就是說Timer的每次定時事件觸發(fā)都會用到一個線程,如果定時的時間間隔小于事件處理的時間,則后臺線程池中將會有越來越多的線程被Timer使用掉,直至線程池中再無空閑的線程。

而ESBasic.Threading.Engines.ICycleEngine的設(shè)計目標(biāo)是永遠(yuǎn)都只使用一個線程。比如,它會隔10秒執(zhí)行一個Action,執(zhí)行完后再隔10秒再執(zhí)行Action。間隔時間的等待與Action的執(zhí)行都是在同一個線程中處理的。

2.適用場合:

根據(jù)上面的描述你應(yīng)該已經(jīng)看到了ICycleEngine與Timer之間的區(qū)別。由于Action的執(zhí)行會占用額外的時間,所以ICycleEngine不適合于精確定時的任務(wù)。比如上面的例子,下一個Action開始的時刻與上一個Action開始的時刻的真正的時間差可能是12秒,而不是10秒,因為上一個Action的執(zhí)行花費(fèi)了2秒。

所以,如果你的系統(tǒng)不需要精確的定時任務(wù),而且又不想花費(fèi)過多的精力去防范使用Timer時線程耗盡的窘境出現(xiàn),那么ICycleEngine將是個不錯的選擇。

3.設(shè)計思想與實現(xiàn)

ICycleEngine接口的源碼如下:  

  1. /// <summary>  
  2. /// ICycleEngine 在后臺線程中進(jìn)行間隔循環(huán)的引擎  
  3. /// zhuweisky 2006.12.21  
  4. /// </summary>  
  5. public interface ICycleEngine  
  6. {  
  7.     /// <summary>  
  8.     /// Start 啟動后臺引擎線程  
  9.     /// </summary>  
  10.     void Start();  
  11.  
  12.     /// <summary>  
  13.     /// Stop 停止后臺引擎線程,只有當(dāng)線程安全退出后,該方法才返回  
  14.     /// </summary>  
  15.     void Stop();  
  16.  
  17.     /// <summary>  
  18.     /// IsRunning 引擎是否運(yùn)行中  
  19.     /// </summary>  
  20.     bool IsRunning { get; }  
  21.  
  22.     /// <summary>  
  23.     /// DetectSpanInSecs 引擎進(jìn)行輪詢的間隔,DetectSpanInSecs=0,表示無間隙運(yùn)作引擎;DetectSpanInSecs小于0則表示不使用引擎  
  24.     /// </summary>  
  25.     int DetectSpanInSecs { get;set; }  
  26.  
  27.     /// <summary>  
  28.     /// OnEngineStopped 當(dāng)引擎由運(yùn)行變?yōu)橥V範(fàn)顟B(tài)時,將觸發(fā)此事件。如果是異常停止,則事件參數(shù)為異常對象,否則,事件參數(shù)為null。  
  29.     /// </summary>  
  30.     event CbException OnEngineStopped;  
  31. }  

如何實現(xiàn)這個接口了?

由于不同的系統(tǒng)要求執(zhí)行的Action不一樣,所以,我們可以實現(xiàn)一個abstract基類BaseCycleEngine來保證循環(huán)引擎的正常運(yùn)轉(zhuǎn),而派生類只要override基類的abstract方法DoDetect來執(zhí)行自己的Action。

關(guān)于BaseCycleEngine的實現(xiàn)要注意以下幾點:

(1)循環(huán)引擎是在后臺線程池的某個線程上運(yùn)行的。

(2)循環(huán)引擎可以無限次的啟動、停止、啟動、停止……

(3)為了保證調(diào)用Stop方法時能迅速地停止引擎,我將間隔時間劃分為多個BaseCycleEngine.SleepTime。而不是一次性地Sleep間隔時間。

(4)為了保證循環(huán)引擎真正停止后,才返回Stop方法的調(diào)用,我使用了ManualResetEvent來進(jìn)行控制。

(5)DoDetect方法的返回值為false,則表示在該Action執(zhí)行完后將停止循環(huán)引擎。此后,可以重新調(diào)用Start方法再次啟動循環(huán)引擎。

4. 使用時的注意事項

(1)     要確保我們的Action(即派生類的DoDetect方法)不任何拋出異常,否則會導(dǎo)致循環(huán)引擎異常停止,并導(dǎo)致循環(huán)引擎的內(nèi)部狀態(tài)損壞而不可用。所以在派生類的DoDetect方法方法實現(xiàn)時捕捉所有的異常并加以處理。

(2)     在DoDetect方法實現(xiàn)中不能調(diào)用Stop方法,否則會導(dǎo)致死鎖出現(xiàn)。

(3)     如果將DetectSpanInSecs設(shè)為0,則表示無間隙的執(zhí)行DoDetect方法。而如果將DetectSpanInSecs設(shè)為負(fù)數(shù),則表示不啟動循環(huán)引擎。

(4)     當(dāng)引擎已經(jīng)啟動并正在運(yùn)行的過程中,如果要改變DetectSpanInSecs的值并使其生效,則必須重新啟動(先調(diào)用Stop方法再調(diào)用Start方法)引擎才可。

5.擴(kuò)展

(1)AgileCycleEngine

在上面的介紹中,我們都是以DoDetect方法來表示要執(zhí)行的Action,而且我們必須以繼承BaseCycleEngine的方式來使用循環(huán)引擎,這無疑限制了循環(huán)引擎的使用。

AgileCycleEngine的存在便是為了突破這個限制。

  1. public sealed class AgileCycleEngine :BaseCycleEngine  
  2. {  
  3.     private IEngineActor engineActor;  
  4.  
  5.     public AgileCycleEngine(IEngineActor _engineActor)  
  6.     {  
  7.         this.engineActor = _engineActor;  
  8.     }  
  9.  
  10.     protected override bool DoDetect()  
  11.     {  
  12.         return this.engineActor.EngineAction();  
  13.     }  
  14. }  

AgileCycleEngine繼承自BaseCycleEngine,但是它是非abstract的。AgileCycleEngine通過組合而非繼承的方式來使用循環(huán)引擎,我們可以將Action的執(zhí)行者抽象為一個接口IEngineActor。

  1. public interface IEngineActor  
  2. {  
  3.     /// <summary>  
  4.     /// EngineAction 執(zhí)行引擎動作,返回false表示停止引擎。  
  5.     /// 注意,該方法不能拋出異常,否則會導(dǎo)致引擎停止運(yùn)行(循環(huán)線程遭遇異常退出)。  
  6.     /// </summary>         
  7.     bool EngineAction() ;  

通過實現(xiàn)IEngineActor來表明我們要執(zhí)行的Action,然后將其注入到AgileCycleEngine中。

(2)永不停止的循環(huán)引擎

我們再考慮一個擴(kuò)展的情況,假設(shè)我們的系統(tǒng)要求在啟動時就將引擎運(yùn)行起來,而且在整個運(yùn)行的生命周期中,都不需要停止引擎,那么我們可能不想將Start方法、Stop方法暴露出來以免意外的調(diào)用Stop方法而導(dǎo)致引擎停止運(yùn)行,那這個時候我們可以使用類似下面的技巧來做到:

  1. public sealed class MyCircleEngine : IEngineActor  
  2. {  
  3.     private AgileCycleEngine agileCycleEngine;  
  4.     public void Initialize()  
  5.     {  
  6.         this.agileCycleEngine = new AgileCycleEngine(this);  
  7.         this.agileCycleEngine.DetectSpanInSecs = 10;  
  8.         this.agileCycleEngine.Start();  
  9.     }  
  10.     #region IEngineActor 成員  
  11.     public bool EngineAction()  
  12.     {  
  13.         // My Action  
  14.         return true;  
  15.     }  
  16.     #endregion  

用于示例的MyCycleEngine內(nèi)部使用了AgileCycleEngine,但它沒有暴露循環(huán)引擎的任何控制方法,而且Initialize方法表明MyCycleEngine只要一初始化便開始運(yùn)行,而且沒有辦法讓其停止運(yùn)行。MyCycleEngine實現(xiàn)了IEngineActor接口,并把自己注入到AgileCycleEngine類型的成員中,于是引擎將每隔10秒鐘執(zhí)行一次MyCycleEngine的EngineAction方法。

【編輯推薦】

  1. .NET框架,該減減肥了
  2. .NET平臺構(gòu)成:操作系統(tǒng),.NET框架到IDE
  3. .NET框架與COM:背景和歷史,關(guān)系的發(fā)展
  4. .NET框架與XML:Web服務(wù)的未來之道
  5. Windows 7 API Code Pack介紹
責(zé)任編輯:yangsai 來源: 博客園
相關(guān)推薦

2009-10-12 09:02:03

SmartRWLock

2009-04-30 10:07:43

VS.NET.NET復(fù)用數(shù)據(jù)庫

2009-10-28 10:15:48

VB.NET框架類庫

2009-08-05 18:42:05

xsd.exe

2009-06-01 11:41:53

SilverlightSilverlight拖放

2010-07-02 09:25:37

.NET 4.0可擴(kuò)展

2009-05-21 13:25:50

.NETCountDownLa微軟

2009-03-16 09:16:13

行為擴(kuò)展WCF.NET

2010-01-05 17:16:28

.NET Framew

2009-08-05 18:49:11

XmlSerializ

2014-10-22 10:50:14

Web前端

2015-09-08 13:50:24

Web前端框架類庫

2023-08-26 20:51:25

Python函數(shù)代碼

2023-10-16 08:22:49

2017-07-18 18:06:00

JavaScript框架類庫

2009-08-04 17:42:23

DataSourceCASP.NET

2009-12-31 14:18:46

ADO.NET類庫

2024-06-18 13:17:02

數(shù)據(jù)庫框架

2024-03-05 09:03:30

.NETMQTT協(xié)議MQTTnet

2024-12-20 19:38:01

ToB業(yè)務(wù)狀態(tài)轉(zhuǎn)換
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产福利资源在线 | 国产午夜精品一区二区三区嫩草 | 久久人体视频 | av在线播放免费 | 91久久综合 | 欧美激情国产日韩精品一区18 | 久久久精品网 | 欧美激情精品久久久久久免费 | 91在线观看 | 中文字幕一区二区三区在线视频 | wwwxxx日本在线观看 | 久久精品91久久久久久再现 | 久久久成人一区二区免费影院 | 国产精品久久久久久久久久久久 | 国产精品视频网址 | 欧美福利| 亚洲人成人一区二区在线观看 | 国产一区二区三区四区五区加勒比 | 久久久女女女女999久久 | 国产精品久久久久久久久久久久久 | 国产亚洲精品久久久久动 | 欧美性高潮 | 成年人在线视频 | 国产欧美一区二区三区在线看 | 91精品91久久久 | 日韩欧美一区二区三区免费看 | 国产成人高清视频 | 成人做爰www免费看视频网站 | 欧美一区二区黄 | 国产激情91久久精品导航 | 免费网站国产 | 精品免费视频 | 国产一区二区在线视频 | 亚洲欧美日韩国产综合 | 波多野结衣在线观看一区二区三区 | 国产在线播 | 中文字幕免费视频 | 亚洲国产精品久久久久婷婷老年 | 91精品麻豆日日躁夜夜躁 | 国产欧美日韩一区二区三区在线观看 | 黑人精品欧美一区二区蜜桃 |