C# - 再次调用事件处理程序时重新启动计时器

时间:2017-12-08 14:16:29

标签: c# winforms timer

我有一个panel的C#WinForms应用程序。面板加载UserControlUserControl包含DataGridView

在我的UserControl中,我在MouseDown

上有DataGrid事件的事件处理程序
private void palletsGrid_MouseDown(object sender, MouseEventArgs e)
{
    try
    {
        EventHandler handler = onScrolling;
        if (handler != null)
        {
            handler(this, new EventArgs());
        }
    }
    Catch (Exception ex)
    {
        Logging.LogWarn("Mouse down error: ", ex);
    }
}

onScrolling是公开声明的EventHandler属性。

我在主窗体中处理这个EventHandler因为,我有一个定时器,每5秒自动刷新一次。因此,当发生此事件(滚动DataGridView)时,我需要知道要停止刷新的主窗体。

在我的主要形式中,这就是我正在做的事情:

private void userControl_ScrollEvent(object sender, EventArgs e)
{
    try
    {
        timer1.Stop();
        Timer pauseTimer = new Timer();
        pauseTimer.Interval = 60000;
        pauseTimer.Start();
        pauseTimer.Tick += new System.EventHandler(pauseTimer_Tick);
    }
    catch (Exception ex)
    {
        Logging.LogFatal("Scroll event capture error: ", ex);
    }
}

这样做,当用户滚动DataGridView时,主窗体停止自动刷新60秒。一旦60秒pauseTimer滴答,refreshTimer恢复正常。

问题:

我需要我的表单才能知道我何时触摸屏幕两次。如同,如果我现在触摸屏幕,计时器启动。不刷新60秒。如果我再次触摸它,60秒需要从第二次触摸开始。不是第一个。因此,每次触摸屏幕时,pauseTimer都需要重新启动。

1 个答案:

答案 0 :(得分:2)

就像@FrankM指出的那样,每次滚动时都不应该创建一个新的计时器。在代码中创建计时器(System.Windows.Forms.Timer)时应始终小心,如果这样做,则必须确保它们正确处理。最简单的方法是从设计师添加计时器,这样就可以为您进行适当的清理。 More on disposal of System.Windows.Forms.Timers

解决方案1:在设计器中添加暂停时间并在滚动事件中重新启动它。如何重新启动计时器可能并不明显,但您可以先禁用计时器,然后启用计时器:

{{1}}

解决方案2:摆脱暂停计时器,只需更改刷新计时器的间隔。

{{1}}