为什么当我在 Elapsed 函数中更改间隔时 C# 计时器会重新启动

Why does C# Timer Restarts When I Change Interval in Elapsed function

我正在使用 System.Timers.Timer Class,我想在 elapsed 函数中更改它的 Interval。当我将 Elapsed 属性 设置为不同的值时,通过定时器的 Autoreset 属性 设置为 false.

我的代码:

            var timer = new Timer()
            {
                Interval = 1000,
                AutoReset = false,
            };

            timer.Enabled = true;
        
            timer.Elapsed += (sender, eventArgs) =>
            {
                Console.WriteLine("Timer fires");
                timer.Interval = 2000;
            };

当我只是想为以后使用定时器更改间隔时,代码会一次又一次地触发定时器。

很高兴知道为什么会发生这种情况以及我应该怎么做才能实现所需的行为。

我不知道为什么在您更改间隔后计时器会再次启动,但这里有一个解决此问题的方法。

timer.Elapsed += (sender, eventArgs) =>
{
    Console.WriteLine("Timer fires");
    timer = new Timer()
    {
        Interval = 2000,
        AutoReset = false,
    };
};

您也可以改用 DispatcherTimer。

var dt = new DispatcherTimer();

dt.Interval = new TimeSpan(0, 0, 1);

dt.Tick += (sender, eventArgs) =>
{
    dt.Stop();
    dt.Interval = new TimeSpan(0, 0, 2);
};

编辑: 经过一些测试,我找到了更好的解决方法。

如果您再次启动计时器而不是更改间隔,然后立即再次停止它,那么它似乎可以工作。

timer.Elapsed += (sender, eventArgs) =>
{
    Console.WriteLine("Timer fires");
    timer.Enabled = true;
    timer.Interval = 2000;
    timer.Enabled = false;
};

Timer.Close 将释放与此计时器对象相关联的所有资源,这似乎对这里有所帮助。

在 Elapsed 事件处理程序逻辑中,当 Timer.Interval 设置为大于零的数字时,它会再次调用“Elapsed”事件,整个逻辑将进入无限循环。

static void Main(string[] args)
{
    var timer = new Timer()
    {
        Interval = 1000,
        AutoReset = false,
    };

    timer.Enabled = true;
    timer.Elapsed += (sender, eventArgs) =>
    {
        Console.WriteLine("Timer fires Elapsed = " + timer.Interval.ToString());
        timer.Close();
        timer.Interval = 800;
    };
    Console.WriteLine("The timer event should have fired just once. Press the Enter key to resume ");
    Console.ReadLine();

    // Again enable the timer to make sure it fires the elapsed event after 800 ms
    timer.Enabled = true;
    Console.WriteLine("Press the Enter key to resume ");
    Console.ReadLine();

    // Overwrite the earlier time interval to 200 ms.
    timer.Interval = 200;
    timer.Enabled = true;
    Console.WriteLine("Press the Enter key to resume ");
    Console.ReadLine();
            
    timer.Enabled = true;
    Console.WriteLine("Press the Enter key to exit the program at any time... ");
    Console.ReadLine();
}