如果 Timer Tick 内的计算花费的时间比 Tick 长度长,会发生什么情况?

What happens if a calculation within a Timer Tick, takes longer than the Tick length?

在 C# System.Windows.Forms.Timer 中,如果计时器节拍内的代码计算时间比节拍长度长,会发生什么情况?

例如,在下面的代码中,如果更新标签的时间比刻度的间隔(1 秒)长,会发生什么情况?

private void timerProgress_Tick( object sender, EventArgs e )
    {
        if( label.Value <= label.Maximum )
        {
            label.Value = item;
        }
        update_label();
    }

虽然这似乎是一个显而易见的问题,但我似乎找不到任何答案。

System.Windows.Forms.Timer 将仅在 UI 线程(拥有表单绑定到的线程)上触发,并且会在时间段过去后的某个时间触发,当线程否则空闲(包括重新绘制 window)。事件处理程序阻止线程执行任何其他操作(包括处理用户输入和重绘事件),直到它返回。

为避免无响应 UI,您通常应仅将此计时器用于动画。您可以将任务排队到线程池,但您也可以使用 System.Threading.Timer,它会在线程池中触发其事件。但是请注意,System.Threading.Timer 不会 检查前一个事件处理程序是否已返回。

在幕后,System.Windows.Forms.Timer 是基于 Win32 SetTimer API。

如问题评论中所述,System.Windows.Forms.Timer 将排队 Tick 事件,如果 all 则阻塞 UI 线程Tick 事件花费的时间比设置的时间间隔长。

事件将根据需要继续计算,与间隔时间无关。

例如,如果您要制作一个滴答为一秒的倒数计时器,但它包含需要 1.3 秒的计算,则会延迟。这意味着您的倒计时时间将不正确,因为 30 秒倒计时实际上将持续约 39 秒,无论一秒 Tick 长度如何。

当然,长运行 任务不应该在 Timer 事件中完成,因为这些任务被强制放到 UI 线程上,您不应该阻止它线程。