定时器(线程)是用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 代码消除了碰撞。
可能巧合的是,多个计时器滴答一个接一个地执行,这样您的代码就可以连续运行多次而不会延迟。
我想确定以下代码没有可重入性。还想知道没有重新进入的线程是否稍后执行(我希望它们被丢弃)。 如果第一个计时器没有完成,下一个计时器会在完成后立即触发还是会额外等待 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 代码消除了碰撞。
可能巧合的是,多个计时器滴答一个接一个地执行,这样您的代码就可以连续运行多次而不会延迟。