自分で開発できるasp.Netプロジェクトで正常に使用されているタイマーWebTimerは、タイマーを聞くようにします

16251 ワード

簡単な説明:
iisは良いサーバで、Webサイトの実行をサポートするのに使いやすい特性がたくさんありますが、開発者の操作に影響を与えることがあります.たとえば、定期的に実行していくつかの操作を行う必要がありますが、iisはアプリケーションプールを利用して管理しているため、Webサイトのあるプロセスが空き(しばらくは誰もアクセスしていない)ときにスレッドをログアウトするため、タイマは正常に動作しません.しかしaspを利用する.NetのCacheメカニズムは,正常に使えるタイマーを巧みに実現できる.
実行効果:
リンクを開いてください
このサイトは1時間ごとに記録を追加し、私のサイトは数百年に1人もアクセスしないと推定されています.ほとんどの時間は空き状態です.
使用方法:
WebサイトWebTimerLibクラスライブラリの参照の追加
次の行のコードを適切な場所で作成します.
 WebTimerLib.WebTimer timer = new WebTimerLib.WebTimer(new System.Threading.TimerCallback(TimeCallback), null, TimeSpan.FromSeconds(2), TimeSpan.FromHours(1));

 
 
この行のコードは、2秒後にTimeCallbackを1時間も実行していないことを示しています.
具体的には各パラメータにソースコードにコメントがあります
ソース:
ソースコードは.Net 3.5の環境下で開発された、推定.net2.0もコンパイルできます.
クラスライブラリのダウンロードアドレス
WebTimerクラスのコード:
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading;
  6 using System.Web.Caching;
  7 using System.Web;
  8 
  9 namespace WebTimerLib
 10 {
 11     /// <summary>
 12     ///      web      
 13     /// </summary>
 14     public class WebTimer : IDisposable
 15     {
 16         /// <summary>
 17         ///     Timer      ,   TimeSpan         。
 18         /// </summary>
 19         /// <param name="callback">   TimerCallback   ,        。 </param>
 20         /// <param name="state">                 ,       (  Visual Basic    Nothing)。 </param>
 21         /// <param name="dueTime">TimeSpan,    callback                 。   -1           。    (0)         。 </param>
 22         /// <param name="period">    callback              。   -1           。 </param>
 23         /// <remarks>
 24         ///    dueTime    (0),      callback。   dueTime   -1   ,      callback;       ,      Change            。
 25         ///    period    (0)   -1   ,   dueTime   ,        callback;            ,      Change            。
 26         ///   callback            ,     ThreadPool         。                          :                   ;             ,            。
 27         /// </remarks>
 28         public WebTimer(TimerCallback callback, Object state, TimeSpan dueTime, TimeSpan period)
 29         {
 30             _callback = callback;
 31             _state = state;
 32             _dueTime = dueTime;
 33             _period = period;
 34             Run(dueTime);
 35         }
 36 
 37         private TimerCallback _callback;
 38         private object _state;
 39         private TimeSpan _dueTime;
 40         private TimeSpan _period;
 41         private bool _isDisposing;
 42         private DateTime _NewDoCallbackTime;
 43 
 44         protected void Run(TimeSpan dueTime)
 45         {
 46             _NewDoCallbackTime = DateTime.Now.Add(dueTime);
 47             HttpRuntime.Cache.Add(CacheID, this, null, _NewDoCallbackTime, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, new CacheItemRemovedCallback(CacheItemRemovedCallback));
 48 
 49         }
 50 
 51         private void CacheItemRemovedCallback(String key, Object value, CacheItemRemovedReason reason)
 52         {
 53             WebTimer timer = (WebTimer)value;
 54             if (reason == CacheItemRemovedReason.Expired)
 55             {
 56                 timer._callback(_state);
 57                 timer.Run(this._period);
 58             }
 59             else if (!timer._isDisposing)
 60             {
 61                 timer.Run(_NewDoCallbackTime - DateTime.Now);
 62             }
 63         }
 64 
 65         /// <summary>
 66         ///                       ,   TimeSpan        。 
 67         /// </summary>
 68         /// <param name="dueTime">   TimeSpan,        Timer                 。    -1             。    (0)           。</param>
 69         /// <param name="period">    Timer                  。   -1           。 </param>
 70         /// <returns></returns>
 71         public bool Change(TimeSpan dueTime, TimeSpan period)
 72         {
 73             this._dueTime = dueTime;
 74             this._period = period;
 75             try
 76             {
 77                 HttpRuntime.Cache.Remove(CacheID);
 78                 this.Run(this._dueTime);
 79                 return true;
 80             }
 81             catch (Exception)
 82             {
 83                 return false;
 84             }
 85         }
 86 
 87         private string _cacheID;
 88         protected string CacheID
 89         {
 90             get
 91             {
 92                 if (_cacheID == null) _cacheID = GetHashCode().ToString();
 93                 return _cacheID;
 94             }
 95         }
 96 
 97         #region IDisposable   
 98 
 99         public void Dispose()
100         {
101             _isDisposing = true;
102         }
103 
104 
105 
106         #endregion
107 
108     }
109 }

 
補足:
私の書く能力に対して私は謝罪して、小さい時国語はマスターしていないで、文章はよくなくて許してください;能力のレベルが限られているので、何か言い間違いがあったら教えてください.
転載について、私は他の人が私の文章を転載するのが好きではありません.価値があると思ったら、ノートなどのソフトをコレクションします.検索エンジンに収録されていないところは、私は私の文章の著作権の問題にあまり関心を持っていません.しかし、私は本当に自分がネットで資料を検索するのが好きではありません.多くの転載は勉強のためではなく、何を考えているのか分からない会社が回ってきて、自分が望んでいるリソースを検索するのがますます難しくなります.しかし、英語の資料を探していると重複することはめったにないことに気づきました.o()^))oまあ、本当に悩んでいます.