2011-01-12 45 views
4

我在Windows服务中有计时器作业,发生错误时应该为其增加间隔。我的问题是我无法获得timer.Change方法来实际更改间隔。 “DoSomething”始终在初始间隔后调用。在Windows服务中更改计时器间隔

代码如下:

protected override void OnStart(string[] args) 
{ 
//job = new CronJob(); 
timerDelegate = new TimerCallback(DoSomething); 
seconds = secondsDefault; 
stateTimer = new Timer(timerDelegate, null, 0, seconds * 1000); 
} 
public void DoSomething(object stateObject) 
{ 
AutoResetEvent autoEvent = (AutoResetEvent)stateObject; 
if(!Busker.BitCoinData.Helpers.BitCoinHelper.BitCoinsServiceIsUp()) 
    { 
    secondsDefault += secondsIncrementError; 
    if (seconds >= secondesMaximum) 
    seconds = secondesMaximum; 
    Loggy.AddError("BitcoinService not available. Incrementing timer to " + 
        secondsDefault + " s",null); 

    stateTimer.Change(seconds * 100, seconds * 100); 
    return; 
} 
else if (seconds > secondsDefault) 
{ 
    // reset the timer interval if the bitcoin service is back up... 
    seconds = secondsDefault; 
    Loggy.Add ("BitcoinService timer increment has been reset to " + 
       secondsDefault + " s"); 
} 
// do the the actual processing here 
} 

回答

2

你实际的问题是在这条线:

secondsDefault += secondsIncrementError; 

它应该是:

seconds += secondsIncrementError; 

此外,Timer.Change方法以毫秒为单位进行操作,所以乘以100显然是错误的。这意味着变化:

stateTimer.Change(seconds * 100, seconds * 100); 

stateTimer.Change(seconds * 1000, seconds * 1000); 

希望它能帮助。

+0

傻我。那很简单。谢谢! – AyKarsi 2011-01-12 15:01:49

0

尝试使用stateTimer.Change(0, seconds * 100);这将立即强制System.Threading.Timer以新的时间间隔重新启动。

+0

试过,但它有相同的效果:( – AyKarsi 2011-01-12 14:55:04