如果Timer Tick中的计算花费的时间长于Tick长度,会发生什么?

时间:2015-05-21 10:03:44

标签: c# winforms timer

在C#System.Windows.Forms.Timer中,如果计时器滴答中的代码计算的时间比刻度长度长,会发生什么?

例如,在下面的代码中,如果更新标签所花费的时间超过了刻度间隔(1秒)会发生什么?

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

正如问题的评论中所述,System.Windows.Forms.Timer将对Tick个事件进行排队,如果所有 Tick事件需要的时间超过,则阻止UI线程设定的间隔。

无论间隔时间如何,只要需要,事件将继续计算。

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

当然,长时间运行的任务不应该在Timer事件中完成,因为这些任务被强加到UI线程上,你不应该阻止该线程。