在C#System.Windows.Forms.Timer
中,如果计时器滴答中的代码计算的时间比刻度长度长,会发生什么?
例如,在下面的代码中,如果更新标签所花费的时间超过了刻度间隔(1秒)会发生什么?
private void timerProgress_Tick( object sender, EventArgs e )
{
if( label.Value <= label.Maximum )
{
label.Value = item;
}
update_label();
}
我似乎无法找到任何答案,虽然这似乎是一个显而易见的问题。
答案 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线程上,你不应该阻止该线程。