Если таймер запустится сам, будет ли когда-нибудь код, запущенный в прошлом, собираться? - PullRequest
2 голосов
/ 04 апреля 2019

У меня есть служба 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();
   }
}

1 Ответ

1 голос
/ 04 апреля 2019

В вашем коде нет утечки памяти, а также больше ничего не собирается и не создается (из того, что вы показали).

  1. С указанным кодом, таймер сам по себе никогда не будет собран или воссоздан.
  2. Если вы создаете экземпляры классов или структур в области действия DoTask(), они выйдут из области действия после его завершения, а затем будут собраны.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...