private void ClearRequestCountersToServiceIniFile()
        {
            try
            {
                IniFile ini = new IniFile(ServiceIniFilename);

                ini.IniRemoveKey("Statistics", "Date"); // zet stats op gisteren met allemaal 0 waardes
                ini.IniRemoveKey("Statistics", "GlobalNumberOfRequests");

                foreach (KeyValuePair <string, UserAccount> kvp in UserAccountManager.CloneUserDatabase())
                {
                    // verwijder de "key"
                    ini.IniRemoveKey("Statistics", string.Format("{0}_NumberOfRequests", kvp.Key));
                } //foreach
            }
            catch
            {
            }
        }
        private void WriteRequestCountersToServiceIniFile()
        {
            try
            {
                IniFile ini = new IniFile(ServiceIniFilename);

                ini.IniWriteValue("Statistics", "Date", DateTime.Now.ToString("yyyy-MM-dd"));
                ini.IniWriteValue("Statistics", "GlobalNumberOfRequests", UserAccountManager.GlobalNumberOfRequests.ToString());

                // Nu per gebruiker stats wegschrijven
                foreach (KeyValuePair <string, UserAccount> kvp in UserAccountManager.CloneUserDatabase())
                {
                    // voor het uitlezen hebben we genoeg aan de "clone" vane de user gegevens
                    ini.IniWriteValue("Statistics", string.Format("{0}_NumberOfRequests", kvp.Key), kvp.Value.NumberOfRequests.ToString());
                } //foreach
            }
            catch
            {
            }
        }
        public void ExecuteTask()
        {
            while (UserAccountManager.WritingToUserDatabase)
            {
                Thread.Sleep(50);
            }

            accountingThreadStarted = true;
            IniFile ini = null;

            try
            {
                // Om maar 1x per uur robot task te draaien
                string webServiceURL = string.Format("http://{0}:{1}/", System.Net.Dns.GetHostName(), PortNumber).ToLower();

                // Lees de statistieken die we bij afsluiten programma hebben weggeschreven
                ini = new IniFile(ServiceIniFilename);
                try
                {
                    UserAccountManager.GlobalNumberOfRequests = Convert.ToInt64(ini.IniReadValue("Statistics", "GlobalNumberOfRequests"));

                    foreach (KeyValuePair <string, UserAccount> kvp in UserAccountManager.CloneUserDatabase())
                    {
                        // voor het uitlezen hebben we genoeg aan de "clone" vane de user gegevens
                        Int64 v = Convert.ToInt64(ini.IniReadValue("Statistics", string.Format("{0}_NumberOfRequests", kvp.Key)));
                        // Nu deze gebruiker gegevens opslaan
                        UserAccount ua = UserAccountManager.Account(kvp.Key);
                        if (ua != null)
                        {
                            ua.NumberOfRequests = v;
                        }
                    } //foreach
                }
                catch
                {
                }
                ini = null;
                ClearRequestCountersToServiceIniFile();

                // Vertel dat we verzoeken kunnen ontvangen. Is voornamelijk voor haproxy!
                Webservice.ForceServiceOffline = false;

                DateTime lastCheckIndex = DateTime.MinValue;
                DateTime lastReboot     = DateTime.Now.Date;
                while (accountingThreadStarted)
                {
                    try
                    {
                        if (Environment.UserInteractive)
                        {
                            // Laat op het scherm zien hoeveel request we binnen hebben.
                            int cLeft = Console.CursorLeft;
                            int cTop  = Console.CursorTop;
                            try
                            {
                                Console.WriteLine(string.Format("Global number of WebService Request : {0,-18}", UserAccountManager.GlobalNumberOfRequests));
                            }
                            finally
                            {
                                Console.CursorLeft = cLeft;
                                Console.CursorTop  = cTop;
                            }
                        }

                        if ((DateTime.Now - lastCheckIndex).TotalDays > 1)
                        {
                            lastCheckIndex = DateTime.Now.Date;

                            /*
                             * if ((DateTime.Now - ReceiveIndex.DateTimeOfIndex).TotalDays > 9)
                             * {
                             *  // Verstuur een mail dat de index te "oud" is
                             *  string message = string.Format("SubFingerindex on {0} is {1} days old", Environment.MachineName, (DateTime.Now - ReceiveIndex.DateTimeOfIndex).TotalDays);
                             *
                             *  Mail.SendMail(Mail.EMail_Automatisering, message, message);
                             * }
                             */
                        }

                        // ==========================================================================================================
                        // Moet de computer worden herstart?
                        // ==========================================================================================================
                        if ((DateTime.Now - lastReboot).TotalDays >= 7 && (DateTime.Now.DayOfWeek == DayOfWeek.Wednesday || DateTime.Now.DayOfWeek == DayOfWeek.Thursday))
                        {
                            Console.WriteLine();
                            Console.WriteLine("Rebooting computer...");
                            Program.RestartApplication = true; // zorg dat deze service wordt gestopt!
                            // Wacht 10 seconden
                            DateTime dt = DateTime.Now;
                            while (accountingThreadStarted && Program.ApplicationState != ApplicationState.Stopped)
                            {
                                Thread.Sleep(100);
                                if ((DateTime.Now - dt).TotalMilliseconds >= (10 * 1000))
                                {
                                    // Hoe dan ook stoppen na 10 seconden
                                    break;
                                }
                            } //while

                            accountingThreadStarted = false;
                            // Wacht 4 seconden!
                            Thread.Sleep(4 * 1000);
                            Console.WriteLine("Reboot signal send.");
                            RebootWindows.Reboot();
                            break;
                        }
                        // ==========================================================================================================

                        if (accountingThreadStarted)
                        {
                            waitEvent.WaitOne(5000, false); // na 5 seconden komen we hoe dan ook even tot leven
                        }
                    }
                    catch (Exception e)
                    {
                        CDRLogger.Logger.LogError(e);
                    }
                } //while

                // Save usage statistics for next run
                WriteRequestCountersToServiceIniFile();
            }
            finally
            {
                Thread.CurrentThread.Abort();
            }

            CDRLogger.Logger.LogInfo("Ending ExecuteTask();");
        }