以往講到 Timer,大家可能會想到 WinForm 上的,以前在寫 WinForm 程式它真的很好用,可惜如果是寫 Console 或 Web,它不能直接拿來用。但新版本的 .NET 重新加了一個 System.Timers.Timer

它的設定也很直覺,程式碼如下:

public class TimerClass
{
    private System.Timers.Timer _timer;

    public TimerClass() 
    {
        _timer = new System.Timers.Timer(500);
        _timer.Elapsed += _timer_Elapsed;
        _timer.AutoReset = true;
        _timer.Enabled = true;
    }

    int count = 10;

    private void _timer_Elapsed(object? sender, ElapsedEventArgs e)
    {
        if(count > 0) 
        {
            Console.WriteLine("_timer_Elapsed");
        }
        else
        {
            _timer.Enabled = false;
            Console.WriteLine("End");
        }
        --count;
        
    }
}

類別在宣告後就會自動執行 _timer_Elapsed 10次後停止,而如果要執行非同步程式,修改如下:

public class TimerClass
{
    private System.Timers.Timer _timer;

    public TimerClass() 
    {
        _timer = new System.Timers.Timer(500);
        _timer.AutoReset = true;
        _timer.Enabled = true;
        _timer.Elapsed += async ( sender, e ) => await HandleTimer(sender, e);
    }

    int count = 10;

    private async Task HandleTimer(object? sender, ElapsedEventArgs e)
    {   
        if (count > 0)
        {
            Console.WriteLine("Async Task");
        }
        else
        {
            _timer.Enabled = false;
            Console.WriteLine("End");
        }
        --count;
        await Task.Delay(500);
    }
}

參考資料