【发布时间】:2015-07-31 20:12:04
【问题描述】:
我想确保以下代码没有可重入性。还想知道未重新进入的线程是否稍后执行(我希望它们被丢弃)。 如果第一个计时器没有完成,下一个计时器会在它完成后立即触发还是会额外等待 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 并在回调后启动计时器更好。
关键是:当时只有一个线程在工作,如果旧线程仍在工作,则丢弃创建的线程。
【问题讨论】:
-
没有意义,使用 AutoReset = false 代替。不需要锁,不需要让线程池忙于无用。并迫使您在 Elapsed 事件处理程序中考虑 try/catch,它是 not 可选的。
标签: c# multithreading timer monitor