定时器(线程)是用monitor.tryenter丢弃还是稍后执行?

Is timer (thread) discarded with monitor.tryenter or it will be executed later?

我想确定以下代码没有可重入性。还想知道没有重新进入的线程是否稍后执行(我希望它们被丢弃)。 如果第一个计时器没有完成,下一个计时器会在完成后立即触发还是会额外等待 15 毫秒?

谢谢

public void MainFunction(IntPtr h, List<int> a)
    {
        myTimer= new System.Timers.Timer();

        myTimer.Elapsed += delegate { eventfired(h, a); };
        myTimer.Interval = 15;
        myTimer.Start();
    }
    private void eventfired(IntPtr h, List<int> a)
    {
        if (System.Threading.Monitor.TryEnter(syncThreads))
        {
            try
            {
                DoWork()

            }
            finally
            {
                System.Threading.Monitor.Exit(syncThreads);
            }
        }
    }

我不确定这是最好的方法还是 autoreset=false 和稍后在回调中启动计时器更好。

重点是:当时只有一个线程在工作,如果旧线程仍在工作,则丢弃已创建的线程。

这行得通。使用 TryEnter(ref bool) 重载,因为它在出现异常时更安全。

If first timer didn't finish, will the next one be immediately fired

为什么会这样。计时器不知道你在做什么。它只是将计时器滴答排队到线程池。您的 TryEnter 代码消除了碰撞。

可能巧合的是,多个计时器滴答一个接一个地执行,这样您的代码就可以连续运行多次而不会延迟。