定时器(线程)是否与监视器一起被丢弃.请尝试输入,否则将稍后执行
本文关键字:输入 执行 是否 线程 监视器 一起 定时器 | 更新日期: 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代码会抛出碰撞。
可能是巧合,多个计时器滴答在另一个之后执行,因此您的代码连续运行多次而没有延迟。