在C#System.
Windows.Forms.Timer中,如果计时器tick中的代码花费的时间比刻度长度长,会发生什么?
例如,在下面的代码中,如果更新标签花费的时间长于刻度间隔(1秒)会发生什么?
private void timerProgress_Tick( object sender, EventArgs e )
{
if( label.Value <= label.Maximum )
{
label.Value = item;
}
update_label();
}
我似乎无法找到任何答案,虽然这似乎是一个显而易见的问题.
最佳答案 System.Windows.Forms.Timer将仅触发UI线程(拥有表单所绑定的线程),并在该时间段过去后的某个时间触发,此时线程处于空闲状态(包括重新绘制窗口) ).事件处理程序阻止线程执行任何其他操作(包括处理用户输入和重绘事件),直到它返回为止.
为避免无响应的UI,通常只应将此计时器用于动画.您可以将任务排队到线程池,但您也可以使用System.Threading.Timer,它会在线程池上触发其事件.但请注意,System.Threading.Timer不检查先前的事件处理程序是否已返回.
在幕后,System.Windows.Forms.Timer基于Win32 SetTimer API.