У меня есть служба Windows на основе .net со следующим псевдокодом. Он просто зацикливается и в зависимости от условия выполняет DoTask () мгновенно или через 60 секунд. Это делается для предотвращения перекрывающихся вызовов таймера, когда DoTask () уже запущен.
Мой вопрос: если это будет сделано, код / объекты, уже запущенные в DoTask (), будут когда-либо собираться мусором? Или, поскольку таймер запускается из DoTask (), который вызывается таймером, стек памяти будет только увеличиваться?
//called once when the service starts
function_startup
{
mainTimer = new System.Timers.Timer();
mainTimer.Interval = 10;
mainTimer.Elapsed += OnTimedEvent;
mainTimer.AutoReset = false; // makes it fire only once
mainTimer.Start();
}
private void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
//some business logic goes here
DoTask();
}
private void DoTask()
{
//some business logic goes here
//will the code that is here be garbage collected eventually
//or will always stay in memory stack increasing the memory that the service takes while running?
//if condition a, run DoTask immediately again.
if (condition_a)
{
mainTimer.Interval = 10;
mainTimer.Start();
}
//else if condition b, sleep for a minute and then DoTask
else (condition_b)
{
mainTimer.Interval = 60000; //run after 60 seconds
mainTimer.Start();
}
}