C# 是使用monitor.tryenter丢弃计时器(线程)还是稍后执行?

C# 是使用monitor.tryenter丢弃计时器(线程)还是稍后执行?,c#,multithreading,timer,monitor,C#,Multithreading,Timer,Monitor,我想确保以下代码没有可重入性。还想知道没有重新进入的线程是否稍后执行(我希望它们被丢弃)。 如果第一个计时器没有完成,下一个计时器会在完成后立即启动,还是会额外等待15分钟 谢谢 public void MainFunction(IntPtr h, List<int> a) { myTimer= new System.Timers.Timer(); myTimer.Elapsed += delegate { eventfired(h, a);

我想确保以下代码没有可重入性。还想知道没有重新进入的线程是否稍后执行(我希望它们被丢弃)。 如果第一个计时器没有完成,下一个计时器会在完成后立即启动,还是会额外等待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);
            }
        }
    }
public void main函数(IntPtr h,列表a)
{
myTimer=新的System.Timers.Timer();
myTimer.appeased+=委托{eventfired(h,a);};
myTimer.Interval=15;
myTimer.Start();
}
私有void eventfired(IntPtr h,列表a)
{
if(System.Threading.Monitor.TryEnter(syncThreads))
{
尝试
{
嫁妆
}
最后
{
系统。线程。监视器。退出(同步线程);
}
}
}
我不确定这是不是最好的方法,或者autoreset=false,稍后在回调中启动计时器更好


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

这是有效的。使用TryEnter(ref bool)重载,因为它在出现异常时更安全

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

为什么会是这样呢。计时器不知道你在做什么。它只是将计时器信号排入线程池。您的TryEnter代码会丢弃冲突


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

您的意思是,这一次?你说的“它引发碰撞”是什么意思?另外,当我打开
锁时(
dowork()
正在被另一个计时器执行),有没有办法不让计时器排队,而是删除/返回它们?如果不可能,我想我可以在
dowork()
之前添加一个变量,以确保它必须工作。否则,请退回。但也许有更干净的方法?谢谢是的,没错。;现在“重复”的定时器信号只是不被执行。我以为这就是你想要的?如果你想让他们排队,要么正常使用
,要么保持一个错过滴答的计数器。这就是我想要的。重复的计时器(=在回调函数上创建的新计时器)应该被划分。现在不执行,以后也不执行。我不明白你之前的回答是什么意思。所以,如果我在tryenter中,新的计时器就不会被执行,对吗?谢谢,我改变了我的重载tryenter方法。这没什么意义,改用AutoReset=false。无需锁定,无需让线程池忙着做任何有用的事情。并强制您在已用事件处理程序中考虑try/catch,这不是可选的。