0

我正在使用System.Timers.TimerClass,我想Interval在 elapsed 函数中更改它。当我将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;
            };

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

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

4

2 回答 2

1

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

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;
};
于 2020-07-08T12:47:45.933 回答
1

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();
}
于 2020-07-08T17:07:43.980 回答