亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

DotNet中的計時器線程計時器

2019-11-17 01:30:11
字體:
來源:轉載
供稿:網友

DotNet中的計時器線程計時器

轉載自:http://hi.baidu.com/wingingbob/item/9f1c9615f3b24d5f2b3e225c
基于多線程設計,計時器工作在ThreadPool線程上,存在事件的重入問題;MSDN只是說基于服務器的計時器可能比Windows計時器精確得多,具體是多少,與線程計時器的精度有關(內部由線程計時器實現),但是我們可以相信它有十分準確的1毫秒;通過Interval屬性或者構造設定計時器觸發時間,在Interval屬性大于0時,并且Enabled屬性為true,將引發Elapsed事件。當AutoReset屬性被設置為false時,只引發一次Elapsed事件,不會周期性回調事件,其默認值為true??梢允褂肧tart()方法和Stop()方法控制Enabled屬性;需要使用Close方法和Dispose方法銷毀資源;注意:一旦服務器計時器對象不存在任何引用,垃圾回收器會回收該對象,因此,在引用失效之前需要使用GC.KeepAlive方法使它不被回收,建議將服務器計時器聲明在類級別或更高,防止此問題的發生;服務器計時器只能應用在.NET Framework中,不被.NET Compact Framework(掌上設備)和XNA Framework(游戲開發)支持。System.Threading.Timer類(線程計時器)前兩個計時器(Windows計時器和服務器計時器)都繼承了Component(組件)類,而且他們可以作為父類被再次繼承。線程計時器則是更“輕量的”計時器,它是密封的,它的聲明如下:[ComVisible(true), HostPRotection(SecurityAction.LinkDemand, Synchronization=true, ExternalThreading=true)]   public sealed class Timer : MarshalByRefObject, IDisposable   {       // Fields       private const uint MAX_SUPPORTED_TIMEOUT = 0xfffffffe;       private TimerBase timerBase;         // Methods        [MethodImpl(MethodImplOptions.NoInlining)]       public Timer(TimerCallback callback);        [MethodImpl(MethodImplOptions.NoInlining)]       public Timer(TimerCallback callback, object state, int dueTime, int period);        [MethodImpl(MethodImplOptions.NoInlining)]       public Timer(TimerCallback callback, object state, long dueTime, long period);        [MethodImpl(MethodImplOptions.NoInlining)]       public Timer(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period);        [MethodImpl(MethodImplOptions.NoInlining), CLSCompliant(false)]       public Timer(TimerCallback callback, object state, uint dueTime, uint period);       public bool Change(int dueTime, int period);       public bool Change(long dueTime, long period);       public bool Change(TimeSpan dueTime, TimeSpan period);        [CLSCompliant(false)]       public bool Change(uint dueTime, uint period);       public void Dispose();       public bool Dispose(WaitHandle notifyObject);       private void TimerSetup(TimerCallback callback, object state, uint dueTime, uint period, ref StackCrawlMark stackMark);   }  從這份聲明中可以看到,它公開了五個重載的構造函數、四個重載的Change方法和兩個重載的Dispose方法,甚至連一個屬性都沒提供,只有構造、Change、Dispose這三樣東西,我們發現,越是底層的,就越簡潔,而簡潔的,不意味著會簡單。構造函數雖然有五個重載,但是第一個(上面聲明代碼中第10行)是不推薦的,因為它只工作在.NET框架上。這個構造函數只需要指定一個TimerCallback回調,而其他幾個構造函數中都有另外三個參數。解釋一下這四個參數的意義:第1個參數,TimerCallback回調。TimerCallback是個委托,處理計時器調用的方法。通過它使計時器到時間后執行我們寫的方法,就像前兩個計時器中所謂的事件,只不過這里用委托回調的方式實現的。但是要清楚,委托的方法并不是在創建Timer的線程上執行的,它會在系統提供的一個單獨的線程池線程中執行。因此要在這個方法中訪問創建Timer線程中的對象,需要在創建Timer的線程里再定義一個委托,同步線程后,通過這個委托去訪問。第2個參數,回調方法傳遞的對象??梢詾閚ull,主要看我們需要不需要有個對象。第3個參數,啟動時間。是第一次回調前延遲時間量??梢杂谜蛿抵殿愋?,毫秒為單位,0是立即啟動,Timeout.Infinite(即-1)是無限大,相當于禁止;也可以用TimeSpan表示時間間隔。第4個參數,周期間隔。在第一次回調之后,周期回調需要的時間間隔。Timeout.Infinite(即-1)會禁止周期回調。同樣可以用整型數值或者TimeSpan表示時間間隔。五個構造函數就不列出來了,看前面的。解釋下第一個構造函數,它只有第一個參數,其他三個參數會被依次設定為null, Timeout.Infinite, Timeout.Infinite。Change方法Change方法有四個重載,用它們可以隨時修改計時器的啟動時間和周期時間,它們的參數與構造函數的第3、4個參數意義相同。一個很實用的例子就是暫停計時器的周期回調:Change(0, Timeout.Infinite);  
官方文檔中:

如果dueTime是零 (0),會立即叫用回呼方法。如果dueTime是Infinite,則永不叫用回呼方法;會停用計時器,若要重新啟用,請呼叫Change並為dueTime指定正值。

如果period是零 (0) 或Infinite,而且dueTime不是Infinite,則只叫用回呼方法一次;會停用計時器的定期行為,若要重新啟用,請呼叫Change並為period指定正值。

Dispose方法 兩個Dispose方法,都是用來釋放該計時器使用的資源。在流程計時器使用完之后,一定記得執行該方法銷毀資源。需要解釋一下它的重載Dispose(WaitHandle),它只被.NET框架平臺支持。它的作用是在釋放完計時器的時候發出WaitHandle信號,而且在資源釋放成功后會返回true。WaitHandle是個抽象類,而我們通常選擇繼承了它的AutoResetEvent類的對象來發送信號。有信號的好處是我們可以給銷毀計時器預留一些時間,來等待計時器占用的資源被全部釋放完之后再執行其他代碼。 就目前來看,你只要會用AutoResetEvent類的Set方法和WaitOne方法就足夠讀懂下面的例子了。雖然這個例子并沒有演示帶信號的Dispose的方法,但是它(MSDN)巧妙地利用AutoResetEvent對象作為計時器委托的參數與Main的線程交互,請認真閱讀下面的每行代碼和每句注釋,你同時會掌握線程計時器和AutoResetEvent類的使用。 [例1]

using System;   using System.Threading;     class TimerExample   {       static void Main()        {           // 將會作為參數傳入計時器回調的方法中,我們通過它向Main函數發送信號。            AutoResetEvent autoEvent = new AutoResetEvent(false);           // StatusChecker是我們寫的包含回調方法,進行狀態檢查的類。假設要檢查5次。            StatusChecker   statusChecker = new StatusChecker(5);           // 為計時器創建一個用于請求statusChecker.CheckStatus方法的委托            TimerCallback timerDelegate = new TimerCallback(statusChecker.CheckStatus);                       Console.WriteLine("{0} 創建計時器。/n", DateTime.Now.ToString("H:mm:ss.fff"));           // 創建計時器,用autoEvent作為委托方法的參數,計時器啟動時間是1秒,周期間隔250毫秒,           // 也就是1秒后請求CheckStatus方法,之后每250毫秒請求一次。            Timer stateTimer = new Timer(timerDelegate, autoEvent, 1000, 250);                      // 在5秒內等待autoEvent信號            autoEvent.WaitOne(5000, false);           // 收到autoEvent信號后或者超過5秒鐘的等待,改變計時周期間隔為500毫秒           // 由于計時器已經啟動,啟動時間設置為0就可以了。            stateTimer.Change(0, 500);            Console.WriteLine("/n改變計時周期間隔。/n");                      // 在5秒內等待autoEvent信號            autoEvent.WaitOne(5000, false);           // 在第二次收到autoEvent信號或者超過5秒鐘,銷毀計時器。            stateTimer.Dispose();            Console.WriteLine("/n銷毀計時器。");        }   }     class StatusChecker   {       int invokeCount, maxCount;         public StatusChecker(int count)        {            invokeCount   = 0;            maxCount = count; //檢查次數        }         // 被計時器委托調用的方法       public void CheckStatus(Object stateInfo)        {            AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;            Console.WriteLine("{0} 狀態檢查 {1,2}",                DateTime.Now.ToString("H:mm:ss.fff"), (++invokeCount).ToString());           if(invokeCount == maxCount)            {               // 計數清零,然后向Main函數發送信號。                invokeCount   = 0;                autoEvent.Set();            }        }   }  
using System;   using System.Text;   using System.Drawing;   using System.Windows.Forms;   using System.ComponentModel;     namespace MessageWindow   {       public partial class MessageWindow : Form        {           //聲明一個線程計時器            System.Threading.Timer _timer;           //窗口自動關閉倒計時,如果沒在構造時更改,默認為不關閉。           int _interval = System.Threading.Timeout.Infinite;           //關閉窗口的委托,其他線程通過這個委托來調用關閉當前窗口的代碼。           delegate void CloseDelegate();             private MessageWindow()            {                InitializeComponent();                picIcon.Image = System.Drawing.SystemIcons.Information.ToBitmap();               //實例化計時器,回調方法到TimerTick,無參數,不啟動,禁止周期回調。                _timer = new System.Threading.Timer(                   new System.Threading.TimerCallback(TimerTick),                   null,                    System.Threading.Timeout.Infinite,                    System.Threading.Timeout.Infinite);               //獲得主屏幕的工作區矩形                Rectangle workArea = Screen.PrimaryScreen.WorkingArea;               //將窗口顯示在屏幕右下方位置                StartPosition = FormStartPosition.Manual;                Location = new Point(workArea.Right - this.Width, workArea.Bottom - this.Height);            }             public MessageWindow(string caption, string text)                : this()            {                lblCaption.Text = caption;                lblText.Text = text;            }             /// <summary>           /// 消息窗口           /// </summary>           /// <param name="caption">消息標題</param>           /// <param name="text">消息內容</param>           /// <param name="interval">消息窗口自動消失時間</param>           public MessageWindow(string caption, string text, int interval)                : this(caption, text)            {                _interval = interval;            }             protected override void OnLoad(EventArgs e)            {               //動畫漸入                NativeMethods.AnimateWindow(this.Handle, 500, NativeConstants.AW_BLEND + NativeConstants.AW_ACTIVATE);               //用_interval啟動計時器,不進行周期計時。                _timer.Change(_interval, System.Threading.Timeout.Infinite);               base.OnLoad(e);            }             //計時器回調方法。這里的代碼將在線程池線程上執行,調用UI線程窗口的Close方法需要請求線程同步,           //通過UI線程的CloseDelegate委托執行關閉窗口,用窗口的Invoke方法執行這個被委托的代碼。           void TimerTick(object obj)            {               if (this.InvokeRequired)                {                    CloseDelegate closeme = delegate
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
青青草原成人在线视频| 欧美在线亚洲在线| 91精品国产91久久久久久吃药| 国产一区私人高清影院| 久久精品久久精品亚洲人| 欧美丰满少妇xxxxx| 久久精品亚洲热| 国产精品免费久久久久影院| 欧美日韩福利在线观看| 亚洲视频一区二区三区| 国产999精品久久久影片官网| 亚洲欧美激情精品一区二区| 久久99亚洲精品| 日韩在线视频观看正片免费网站| 538国产精品一区二区免费视频| 欧美电影在线观看网站| 亚洲福利小视频| 欧美在线激情网| 日韩av成人在线| 日韩久久精品电影| 精品美女久久久久久免费| 亚洲最大的av网站| 亚州国产精品久久久| 成人精品aaaa网站| 久久久久久久久国产| 久久人人爽国产| 中文字幕久热精品在线视频| 国内精品小视频在线观看| 日本高清不卡在线| 日韩在线中文视频| 91国自产精品中文字幕亚洲| 亚洲一区二区免费| 亚洲国产日韩欧美在线图片| 91极品女神在线| 国产精品视频导航| 97精品免费视频| 91亚洲精品在线| 国产精品久久久久久久久影视| 国产69精品久久久久9| 国产欧美一区二区三区视频| 综合网中文字幕| 91精品国产91| 精品亚洲一区二区三区四区五区| 91精品久久久久久久久青青| 久久久久久久久久久免费精品| 日韩精品在线电影| 欧美一区二区三区免费视| www.日韩不卡电影av| 欧美日韩色婷婷| 久久久亚洲影院你懂的| 亚洲精品国产综合区久久久久久久| 国产精品海角社区在线观看| 久久久精品电影| 国产午夜精品一区理论片飘花| 国产日韩欧美中文在线播放| 亚洲欧美三级伦理| 午夜精品久久久久久久男人的天堂| 97色伦亚洲国产| 亚洲无亚洲人成网站77777| 综合网日日天干夜夜久久| 91人人爽人人爽人人精88v| 日韩亚洲欧美成人| 亚洲伊人第一页| 国产成人在线视频| 26uuu亚洲伊人春色| 色综合久久中文字幕综合网小说| 这里只有精品在线观看| 久久精品国产一区二区三区| 欧美成人性色生活仑片| 国产精品女人网站| 中文字幕av一区二区| 精品国产一区二区三区四区在线观看| 亚洲国产精品系列| 日韩va亚洲va欧洲va国产| 国产日韩欧美影视| 欧美精品在线观看| 91极品视频在线| 九九热这里只有精品免费看| 日韩高清免费在线| 亚洲人成伊人成综合网久久久| 国产主播精品在线| 亚洲18私人小影院| 欧美午夜性色大片在线观看| 九九九久久国产免费| 91九色精品视频| 在线视频精品一| 色综合天天狠天天透天天伊人| 国产精品免费看久久久香蕉| 91天堂在线观看| 2018国产精品视频| 亚洲最大成人免费视频| 欧美高跟鞋交xxxxxhd| 精品人伦一区二区三区蜜桃网站| 高清日韩电视剧大全免费播放在线观看| 91精品综合视频| 国产亚洲欧洲高清| 国产在线精品成人一区二区三区| 欧美老女人在线视频| 亚洲男人的天堂在线播放| 欧美亚洲成人精品| 欧美一区二区三区图| 狠狠躁夜夜躁人人爽超碰91| 欧美日韩亚洲精品一区二区三区| 国产偷亚洲偷欧美偷精品| 国产精品99久久久久久久久久久久| 一本久久综合亚洲鲁鲁| 国产噜噜噜噜噜久久久久久久久| 亚洲精品99999| 成人情趣片在线观看免费| 久久久免费精品| 欧美放荡办公室videos4k| 欧美日韩国产成人| 日韩av免费在线| 亚洲欧美中文日韩v在线观看| 久久久免费观看视频| 久久综合色88| 91精品国产91久久久久久吃药| 国产日韩在线观看av| 亚洲视频自拍偷拍| 人妖精品videosex性欧美| 日韩成人黄色av| 91色琪琪电影亚洲精品久久| 亚洲专区国产精品| 亚洲xxxxx性| 亚洲欧美在线一区二区| 日本一区二三区好的精华液| 啊v视频在线一区二区三区| 不卡伊人av在线播放| 欧美大肥婆大肥bbbbb| 国产精品免费视频xxxx| 久久久精品免费| 国产精品久久久久久久av电影| 久久成人在线视频| 欧美成在线视频| 久久久久久av| 精品久久久久久中文字幕| 亚洲国产成人av在线| 午夜精品一区二区三区在线视频| 亚洲国产精品专区久久| 亚洲一区二区三区xxx视频| 最近中文字幕mv在线一区二区三区四区| 欧美自拍视频在线| 国产精品99久久久久久www| 国产精品国产三级国产aⅴ浪潮| 久久亚洲精品一区二区| 91久久久久久久一区二区| 九九精品在线观看| 日韩视频免费看| 日韩在线视频中文字幕| 国产精品第100页| 国产成人在线精品| 伊人激情综合网| 亚洲美女性生活视频| 精品久久久免费| 尤物九九久久国产精品的特点| 亚洲区在线播放| 日本国产欧美一区二区三区| 97在线视频国产| 久久精品国产精品| 欧美精品videossex性护士| 2019中文字幕在线| 色婷婷综合成人| 久久99精品久久久久久琪琪| 亚洲精品中文字幕有码专区|