订阅后为什么我的计时器一段时间不触发?

时间:2019-02-26 12:42:06

标签: c# events timer event-handling handler

我有一个计时器(System.Timers.Timer),每100毫秒触发一次。

我向计时器订阅了一个事件处理程序,它可以正常工作:

  public override void TimerEvent(object source, ElapsedEventArgs e)
    {
        lock (timerlock)
        {
            Timer.Stop();
            ...
            Timer.Start();
        }
    }

我使用了定时器锁,因此当我取消订阅定时器时,可以确定自己不在TimerEvent方法的中间。

因此,当我想退订计时器时,请执行以下操作:

    lock (timerlock)
    {
        Timer.Elapsed -= TimerEvent;
    }
    try
    {
       DoSomethingThatTakesUpToAMinute();
    }
    catch (Exception ex)            
    {
        MessageBox.Show("...");
    }
    finally
    {
        Timer.Elapsed += TimerEvent;
    }

但是,当我在finally块中再次订阅Timer时,我的程序将花费15秒,直到下一个Timer Event被注册为止,即使已经执行了finally。请注意,我在取消订阅和重新订阅计时器之间所做的事情可能要花费一分钟。

我可以在控制台中看到,在finally块之后,大约有5个线程以错误代码0结尾,一旦它们全部结束,我的TimerEvents就会再次被触发。

有什么想法吗?

0 个答案:

没有答案