Hen*_*rik 5 .net c# multithreading
我有一个Windows服务(.NET 4)定期处理队列,例如每15分钟.我使用的System.Threading.Timer是当服务开始每X毫秒触发一次回调时设置的.通常每次运行需要几秒钟而且永远不会发生冲突,但如果我不能假设那么 - 那么如果处理正在进行中,我希望下一次运行立即退出.
这可以通过锁定,易失性bool或监视器轻松解决,但实际上在这种情况下使用的是什么,或者只是一般的首选选项?
我发现其他帖子几乎可以解决这个问题(比如Volatile vs. Interlocked vs. lock)但是需要一些建议才能将其扩展到Timer示例并立即退出.
您不需要任何锁定,您应该从计时器委托中重新安排下一个计时器执行.这应该确保100%没有重叠.
在计时器的事件处理程序调用结束时,计时器timer.Change(nextRunInMilliseconds, Timeout.Infinite)将仅在之后触发一次nextRunInMilliseconds.
例:
//Object that holds timer state, and possible additional data
private class TimerState
{
public Timer Timer { get; set; }
public bool Stop { get; set; }
}
public void Run()
{
var timerState = new TimerState();
//Create the timer but don't start it
timerState.Timer = new Timer(OnTimer, timerState, Timeout.Infinite, Timeout.Infinite);
//Start the timer
timerState.Timer.Change(1000, Timeout.Infinite);
}
public void OnTimer(object state)
{
var timerState = (TimerState) state;
try
{
//Do work
}
finally
{
//Reschedule timer
if (!timerState.Stop)
timerState.Timer.Change(1000, Timeout.Infinite);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
298 次 |
| 最近记录: |