繁体   English   中英

当我更改已用 function 的间隔时,为什么 C# 计时器会重新启动

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

我正在使用System.Timers.Timer Class,我想在经过的 function 中更改它的Interval 当我将Elapsed属性设置为不同的值时,不知何故,经过的 function 开始触发并再次触发,但计时器的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 将释放与此计时器 object 相关的所有资源,它似乎在这里有所帮助。

在 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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM