C# Timer 定時器


Timer簡單介紹

構造函數

通過ILSpy反編譯可以看到Timer的內部代碼。

Timer 的默認構造函數里賦了初值,所以當我們初始化Timer的時候,已經有了默認值。

Timer 的帶參數的構造函數會重新給 interval(獲取或設置引發 Elapsed 事件的間隔,以毫秒為單位。)賦值。

 

Elapsed事件(達到間隔時發生

匿名函數傳遞

System.Timers.Timer t = new System.Timers.Timer(1000 * 60 * 10); //實例化,設置時間間隔為十分鍾,此處參數單位為毫秒。//匿名函數傳遞
t.Elapsed += (s, e) =>
{
    print(DateTime.Now);
};

非匿名函數傳遞

System.Timers.Timer t = new System.Timers.Timer(1000 * 60 * 10); //實例化,設置時間間隔為十分鍾,此處參數單位為毫秒。
t.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => print(DateTime.Now));//非匿名函數傳遞

下面是寫在 Global.asax.cs 里例子,項目啟動的時候會執行:

//第一個訪問網站的用戶會觸發該方法。
protected void Application_Start()
{
    DateTime dt = DateTime.Now;
System.Timers.Timer t = new System.Timers.Timer(1000 * 60 * 10); //實例化,設置時間間隔為十分鍾,此處參數單位為毫秒 t.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => print(dt)); t.AutoReset = true; //每到指定時間Elapsed事件是觸發一次(false),一直觸發(true) t.Enabled = true; //是否觸發Elapsed事件 t.Start(); }

定時器

現在我們有個需求,需要每天12點來觸發 print 方法,那么我們需要利用 Timer 寫一個定時器。通過更改 Interval 屬性的數值,來調整觸發方法的時間。

下面是demo

private static readonly System.Timers.Timer Timer = new System.Timers.Timer(); //初始化。
private static DateTime dt = new DateTime(); //固定時間。

/// <summary>
/// 程序入口(自行調用)
/// </summary>
/// <param name="timing">定時時間(格式:年月日時分秒)</param>
public void Init()
{
    dt = DateTime.Now;
    SetInterval();
    Timer.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => SetInterval());
}

/// <summary>
/// 定時器
/// </summary>
/// <param name="timing">定時時間(格式:年月日時分秒)</param>
private void SetInterval()
{
    Timer.Stop();
    var now = DateTime.Now;
    if (now >= dt)//如果當前時間>=定時時間
    {
        //定時結束之后,你要執行的代碼
        print(now);
        //----------------------------------------------------------
        //此處可修改dt。更改需求。
        //----------------------------------------------------------
        dt = DateTime.Now.Date.AddDays(1).AddHours(12); //重新計算定時時間,第二天12點再執行。
        //dt = DateTime.Now.AddMinutes(0.1);//重新計算定時時間,每分鍾執行一次。
        SetInterval();
    }
    else//如果當前時間<定時時間
    {
        Timer.Interval = dt.Subtract(now).TotalMilliseconds;//重新計算定時時間,按毫秒計算。
        Timer.Start();
    }
}

/// <summary>
/// 測試輸出
/// </summary>
public void print(DateTime dt)
{
    num++;
    Console.WriteLine("執行第{0}次,時間:{1}", num, dt);
}
固定時間定時器

效果:

現在需求變更為每天11點到下午17點的時候觸發,間隔1分鍾。

下面是demo

private static readonly System.Timers.Timer Timer = new System.Timers.Timer(); //初始化。
private static DateTime dtStar = new DateTime(); //時間段--開始時間。
private static DateTime dtEnd = new DateTime(); //時間段--結束時間。
private static int intervalTime = 10;//間隔時間(分鍾)。

/// <summary>
/// 程序入口(自行調用)
/// </summary>
/// <param name="timing">定時時間(格式:年月日時分秒)</param>
public void Init()
{
    dtStar = DateTime.Now.Date.AddDays(0).AddHours(11);//今天11點。
    dtEnd = DateTime.Now.Date.AddDays(0).AddHours(17);//今天17點。
    intervalTime = 1;//每1分鍾執行一次。
    SetInterval();
    Timer.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => SetInterval());
}

/// <summary>
/// 定時器(間斷)
/// </summary>
/// <param name="timing">起始時間</param>
private void SetInterval()
{
    Timer.Stop();
    var now = DateTime.Now;
    if (now.Hour >= dtStar.Hour && now.Date == dtStar.Date)//達到開始時間,並且是今天
    {
        if (dtEnd.Subtract(now).TotalMinutes >= intervalTime)//小於結束時間
        {
            print(now);//打印
            //----------------------------------------------------------
            //此處可修改dtStar,dtEnd,intervalTime,三個參數。更改需求。
            //----------------------------------------------------------
            Timer.Interval = now.AddMinutes(intervalTime).Subtract(now).TotalMilliseconds;
            Timer.Start();
        }
        else
        {
            //----------------------------------------------------------
            //此處可修改dtStar,dtEnd,intervalTime,三個參數。更改需求。
            //----------------------------------------------------------
            dtStar = DateTime.Now.Date.AddDays(1).AddHours(11);//第二天11點。
            dtEnd = DateTime.Now.Date.AddDays(1).AddHours(17);//第二天17點。
            intervalTime = 2;//每2分鍾執行一次。
            Timer.Interval = dtStar.Subtract(now).TotalMilliseconds;
            Timer.Start();
        }
    }
    else//如果 定時時間>當前時間
    {
        Timer.Interval = dtStar.Subtract(now).TotalMilliseconds;//重新計算定時時間,按毫秒計算。
        Timer.Start();
    }
}

/// <summary>
/// 測試輸出
/// </summary>
public void print(DateTime dt)
{
    num++;
    Console.WriteLine("執行第{0}次,時間:{1}", num, dt);
}
間斷時間定時器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM