/// <summary>
        /// Starts the service as service process or user interactive commandline program. In user interactive mode a logconsole is created to receive messages.
        /// In service mode an eventlog is used.
        /// </summary>
        public void Run()
        {
            try
            {
                Init();
                if (IsWindowsService)
                {
                    Run(this);
                    return;
                }

                if (SystemConsole.IsConsoleAvailable && SystemConsole.CanReadKey)
                {
                    SystemConsole.SetKeyPressedEvent(OnKeyPressed);
                }

                // run commandline
                CommandLineRun();
            }
            catch (Exception ex)
            {
                log.LogEmergency(ex, "Unhandled exception:\n" + ex.ToXT());
            }
            finally
            {
                // force stop if not already stopped / set stopped flag at service
                if (IsWindowsService)
                {
                    Stop();
                }

                Logger.Flush();
                Logger.Close();
                SystemConsole.RemoveKeyPressedEvent();
                if (Debugger.IsAttached)
                {
                    Thread.Sleep(1000);
                    SystemConsole.WriteLine("--- Press <yellow>enter<default> to exit ---");
                    SystemConsole.ReadLine();
                }
            }
        }