定时器(线程)是否与监视器一起被丢弃.请尝试输入,否则将稍后执行

本文关键字:输入 执行 是否 线程 监视器 一起 定时器 | 更新日期: 2023-09-27 18:05:44

我想确保下面的代码没有可重入性。还想知道如果线程没有重新进入以后执行或不(我希望他们被丢弃)。如果第一个计时器没有完成,下一个计时器会在完成后立即触发还是会再等待15ms ?

感谢
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)重载,因为它在存在异常时更安全。

如果第一个计时器没有完成,会立即触发下一个计时器吗

为什么会这样呢?计时器不知道你在做什么。它只是将计时器刻度排队到线程池。你的TryEnter代码会抛出碰撞。

可能是巧合,多个计时器滴答在另一个之后执行,因此您的代码连续运行多次而没有延迟。