计时器在长事件期间不启动

Posted

技术标签:

【中文标题】计时器在长事件期间不启动【英文标题】:Timer doesn't raise during long event 【发布时间】:2021-03-05 07:13:15 【问题描述】:

我正在尝试在开始按钮事件(启动我的程序 - 长时间事件)上向操作员显示计时器 00:00 我启用了计时器,但它仅在事件完成或出现消息框时才打勾。

我正在使用 C# 表单计时器。

知道如何在长事件期间在 C# 中实现计时器吗?我认为与线程计时器有关?任何例子?请帮忙 !谢谢

private void Timer_elapsed_Tick(object sender, EventArgs e)
    
        timeSec++;
        if(timeSec >= 60)
        
            timeSec = 0;
            timeMin++;
        
        DrawTime();
    

    private void DrawTime()
    
        lbSec.Text = string.Format("0:00", timeSec);
        lbMin.Text = string.Format("0:00", timeMin);
    

private void start_Click(object sender, EventArgs e)
    
      timer_elapsed.Enabled = true;
      //do some event (long time) 
      //timer not works during this event 


    
// when the event finished timer works 

【问题讨论】:

在 UI 线程上触发计时器,只要 UI 线程忙于您的代码,它就不会触发。 相关:Timer doesn't raise during of long event is running 我同意我们,如何解决? @klaus Gutter,好的。解决方案是什么? 不要直接在 Click 事件中做长处理。您可以使用任何异步事件处理程序,或启动后台线程。 【参考方案1】:

我认为定时器控件与 Tick 事件无关。检查您的代码表单设计器cs是否为“Timer_elapsed_Tick”正确配置了有线事件处理程序。 this.timer_elapsed.Tick += new System.EventHandler(this.Timer_elapsed_Tick);

【讨论】:

OP 声明“只有在事件完成或消息框出现时才会打勾”,这实际上表示事件已连接。【参考方案2】:

解决方案: 1.使用 System.Timers.Timer 而不是 windows form timer 。 2.添加点击事件Application.DoEvents。

【讨论】:

永远不要使用Application.DoEvents()。它只是在向后兼容 VB6 的框架中。这是纯粹的邪恶。

以上是关于计时器在长事件期间不启动的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单击按钮启动倒数计时器事件?

在 Windows 服务中从事件处理程序启动计时器

在页面刷新期间持续存在的 Javascript 倒计时

QTimer 线程亲和性

如何在python中制作计时器而不冻结整个代码

window.orientation 在 onresize 中报告旧值