最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#四種計時器Timer的區(qū)別和用法

 更新時間:2022年05月16日 09:44:32   作者:springsnow  
這篇文章介紹了C#四種計時器Timer的區(qū)別和用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1、System.Threading.Timer 線程計時器

1、最底層、輕量級的計時器。基于線程池實現(xiàn)的,工作在輔助線程。

2、它并不是內(nèi)在線程安全的,并且使用起來比其他計時器更麻煩。此計時器通常不適合 Windows 窗體環(huán)境。

構(gòu)造函數(shù):public Timer(TimerCallback callback, object state, int dueTime, int period);

string state=”.”;
//state參數(shù)可以傳入想在callback委托中處理的對象??梢詡鬟f一個AutoRestEvent,在回調(diào)函數(shù)中向主函數(shù)發(fā)送信號。
Timer timer=new Timer(TimeMethod,state,100,1000)//100表示多久后開始,1000表示隔多久執(zhí)行一次。

void TimerMethod(object state)
{Console.Write(state.ToString());}

timer.Dispose();//取消timer執(zhí)行

2、System.Timers.Timer  服務(wù)器計時器

1、針對服務(wù)器的服務(wù)程序,基于System.Threading.Timer,被設(shè)計并優(yōu)化成能用于多線程環(huán)境。在這種情況下,應(yīng)該確保事件處理程序不與 UI 交互。在asp.net中一般使用System.Timers.Timer。

2、繼承自Compnent,公開了可以SynchronizingObject 屬性,避免了線程池中無法訪問主線程中組件的問題(模擬System.Windows.Forms.Timer單線程模式)。但是除非需要對事件的時間安排進行更精確的控制,否則還是應(yīng)該改為使用 System.Windows.Forms.Timer。

3、AutoReset屬性設(shè)置計時器是否在引發(fā)Elapsed事件后重新計時,默認為true。如果該屬性設(shè)為False,則只執(zhí)行timer_Elapsed方法一次。

4、System.Timers.Timer是多線程定時器,如果一個Timer沒有處理完成,到達下一個時間點,新的Timer同樣會被啟動。所以,Timer比較適合執(zhí)行不太耗時的小任務(wù),若在Timer中運行耗時任務(wù),很容易出現(xiàn)由于超時導(dǎo)致的多線程重入問題,即多個線程同時進入timer_Elapsed方法。

System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 500;
timer.SynchronizingObject = this;

timer.Elapsed+=new System.Timers.ElapsedEventHandler(timer_Elapsed);

timer.Start(); private void timer_Elapsed(Object source, Timers.ElapsedEventArgs e)
{
    this.tbTimer.Text = value;
}

5、為了應(yīng)對多線程重入問題??梢约渔i,也可以增加標志位。 Interlocked.Exchange提供了一種輕量級的線程安全的給對象賦值的方法,所以使用Interlocked.Exchange給變量賦值。

int inTimer = 0;
        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (Interlocked.Exchange(ref inTimer, 1) == 0)
            {
                Thread.Sleep(3000);
                string currentThreadId = Thread.CurrentThread.ManagedThreadId.ToString();
                this.Dispatcher.BeginInvoke(new Action(() =>
                {
                    this.Label_Result.Content += currentThreadId + ",";
                }), null);
                Interlocked.Exchange(ref inTimer, 0);
            }
        }

3、System.Windows.Forms.Timer  Windows計時器

此計時器直接繼承自Component,它經(jīng)過了專門的優(yōu)化以便與 Windows 窗體一起使用,并且必須在窗口中使用。

  • Windows計時器建立在基于消息的UI線程上運行,精度限定為5ms。Tick事件中執(zhí)行的事件與主窗體是同一個線程(單線程),并且對與 UI 交互是安全的。
  • 只有Enable和Internal兩個屬性和一個Tick事件,可以使用Start()和Stop()方法控制Enable屬性。
using System.Windows.Forms;

public Form1()
{
    InitializeComponent();
    this.Load += delegate
    {
        Timer timer = new Timer();
        timer.Interval = 500;
        timer.Tick += delegate
        {
            System.Diagnostics.Debug.WriteLine($"Timer Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
            System.Diagnostics.Debug.WriteLine($"Is Thread Pool: {System.Threading.Thread.CurrentThread.IsThreadPoolThread}");
            this.lblTimer.Text = DateTime.Now.ToLongTimeString();
        };

        timer.Start();
        System.Diagnostics.Debug.WriteLine($"Main Thread: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
    };
}

4. System.Windows.Threading.DispatcherTimer

主要用于WPF中。屬性和方法與System.Windows.Forms.Timer類似。DispatcherTimer中Tick事件執(zhí)行是在主線程中進行的。

使用DispatcherTimer時有一點需要注意,因為DispatcherTimer的Tick事件是排在Dispatcher隊列中的,當系統(tǒng)在高負荷時,不能保證在Interval時間段執(zhí)行,可能會有輕微的延遲,但是絕對可以保證Tick的執(zhí)行不會早于Interval設(shè)置的時間。如果對Tick執(zhí)行時間準確性高可以設(shè)置DispatcherTimer的priority。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C# Winform中如何繪制動畫示例詳解

    C# Winform中如何繪制動畫示例詳解

    這篇文章主要給大家介紹了關(guān)于C# Winform中如何繪制動畫的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用C# Winform具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C#操作串口通信協(xié)議Modbus的常用方法介紹

    C#操作串口通信協(xié)議Modbus的常用方法介紹

    這篇文章介紹了C#操作串口通信協(xié)議Modbus的常用方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#中DataGridView導(dǎo)出Excel的兩種方法

    C#中DataGridView導(dǎo)出Excel的兩種方法

    這篇文章主要介紹了C#中DataGridView導(dǎo)出Excel的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C# 命名空間(Namespace)相關(guān)知識總結(jié)

    C# 命名空間(Namespace)相關(guān)知識總結(jié)

    這篇文章主要介紹了C# 命名空間(Namespace)的相關(guān)知識,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下
    2020-06-06
  • C#中進程的掛起與恢復(fù)

    C#中進程的掛起與恢復(fù)

    這篇文章主要介紹了C#中進程的掛起與恢復(fù)操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • 淺談c# 浮點數(shù)計算

    淺談c# 浮點數(shù)計算

    本文通過具體的示例給大家演示了下C#中浮點數(shù)運算所遇到的問題及解決方法,有需要的小伙伴可以參考下
    2017-09-09
  • C#實現(xiàn)Redis的分布式鎖

    C#實現(xiàn)Redis的分布式鎖

    我們在開發(fā)很多業(yè)務(wù)場景會使用到鎖,例如庫存控制,抽獎等。分布式與單機情況下最大的不同在于其不是多線程而是多進程。本文就來介紹一下,感興趣的可以了解一下
    2021-08-08
  • c#使用nsoup解析html亂碼解決方法分享 nsoup教程

    c#使用nsoup解析html亂碼解決方法分享 nsoup教程

    NSoup是JSoup的Net移植版本。使用方法基本一致。如果項目涉及HTML的處理,強烈推薦NSoup。但是遺憾的是NSoup默認的編碼是UTF-8,處理中文有亂碼,下面給出二種解決方法
    2014-01-01
  • 用c#獲得當前用戶的Application Data文件夾位置

    用c#獲得當前用戶的Application Data文件夾位置

    用c#獲得當前用戶的Application Data文件夾位置...
    2007-03-03
  • C# winform自定義翻頁控件詳解

    C# winform自定義翻頁控件詳解

    這篇文章主要為大家詳細介紹了C# winform自定義翻頁控件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評論

通河县| 依兰县| 桐梓县| 萝北县| 界首市| 阿图什市| 谷城县| 广南县| 太湖县| 囊谦县| 宜兰县| 肇东市| 巴里| 杭锦旗| 沐川县| 郯城县| 新干县| 古浪县| 理塘县| 内黄县| 绵阳市| 珠海市| 海南省| 潞城市| 思茅市| 苍溪县| 东阳市| 图木舒克市| 手游| 海安县| 庆云县| 巧家县| 佳木斯市| 玉树县| 徐闻县| 昂仁县| 翼城县| 富川| 成武县| 永清县| 文山县|