I have a windows service that should poll a database for every 5 seconds for the new entries and update the log file.
I am using System.Timers.Timer class to call my Database method and calling Autocancellation for every 5 seconds.
 protected override void OnStart(string[] args)
 {
     try
     {
            ServiceLogFile("Service is started at " + DateTime.Now);
            timer.Elapsed += new ElapsedEventHandler(Autocancellation);
            timer.Interval = Int32.Parse(ConfigurationManager.AppSettings["tracktime"]); //number in miliseconds 
            timer.Enabled = true;
      }
      catch(Exception ex)
      {
           ServiceLogFile("Error in {OnStart} :" + ex.ToString());
      }
  }
  public void Autocancellation(object source, ElapsedEventArgs e)
  {
        try
        {
            lock (this)
            {
                //Database accesss
                //select statement 
                //Adding to Data table 
                if(dt.Rows.Count>0)
                {
                    //Update Statements 
                }
                else
                {
                     ServiceLogFile("There is no orders in the table Thread id :" +Thread.CurrentThread.ManagedThreadId);
                 }
              }
       }
   }
Autocancellation method will be having database access and update statements.
Expected Workflow -
It should update all the entries in the database and return back to the onStart method and poll for every 5 seconds.
Issue -
Whenever it completes updating the rows and if it has time (like if it finishes the updation statement in 2 mins at the last Iteration) and remaining 3 mins it will print "There is no orders in the table". I am not able to stop printing this until it finishes whole its timer.
I tried stopping the timer - But this leads to it will never poll the database again from onStart method.
Here is the sample of logs
When updation starts -
Service is stopped at 8/4/2019 1:34:15 PM
Service is started at 8/4/2019 1:34:28 PM
Database check :8/4/2019 1:34:33 PM
{INFO} Cancelled Order {AccessionID} : A1
{INFO} Cancelled Order {AccessionID} : A2
{INFO} Cancelled Order {AccessionID} : A3
End of Iteration -
{INFO} Cancelled Order {AccessionID} : A49997
{INFO} Cancelled Order {AccessionID} : A49998
{INFO} Cancelled Order {AccessionID} : A49999
{INFO} Cancelled Order {AccessionID} : A50000
Database check :8/4/2019 1:51:53 PM
There is no orders in the table Thread id :4
Database check :8/4/2019 1:51:53 PM
There is no orders in the table Thread id :3
Database check :8/4/2019 1:51:53 PM
There is no orders in the table Thread id :7
If we can see the above logs its looping in the same method to print no records. I tried with killing thread and return statements. Nothing worked.
After this Iteration time (5 seconds) This will be returned to the onStart and polls for 5 seconds correctly and logs are perfect -
Database check :8/4/2019 1:52:04 PM
There is no orders in the table Thread id :96
Database check :8/4/2019 1:52:09 PM
There is no orders in the table Thread id :97
Database check :8/4/2019 1:52:14 PM
Help in stopping the timer for the running instance and it should poll back as expected.