Почему моя служба Windows автоматически завершает работу примерно через 5 секунд? - PullRequest
2 голосов
/ 28 сентября 2010

Я создал службу Windows, используя C #, которая при вызове OnStart создает новый поток из другого класса.Затем этот новый поток зацикливается на ожидании любых входящих TCP-соединений.Или так и должно быть.Когда я запускаю службу, она автоматически останавливается примерно через 5 секунд.Я не знаю, почему он это делает.Я понимаю, что сервисы закрываются сами по себе, если у них нет работы, но работа для них определена.У кого-нибудь есть идеи, почему это происходит?Мой метод OnStart выглядит следующим образом:

protected override void OnStart(string[] args)
    {
        Thread thread = new Thread(new StateMachine().AcceptConnections);
        thread.Start();      
    }

, который затем вызывает этот метод:

        Int32 port = 13000;
        IPAddress localAddr = IPAddress.Parse("127.0.0.1");

        server = new TcpListener(localAddr, port);

        // Start listening for client requests.
        server.Start();
        // Enter the listening loop.
        do
        {
            client = server.AcceptTcpClient();
            ReceivedData();                
        } while (true);
    }

Он не остается достаточно длинным, чтобы позволить любым клиентам подключаться к TcpListner.*

Помощь?

Ответы [ 3 ]

1 голос
/ 28 сентября 2010

Во-первых, вы уверены, что хотите, чтобы ваш сервис породил новый поток, чтобы сделать это? Вы не можете просто сделать это в главном потоке?

Чтобы устранить проблему, выполните одно или оба из следующих действий:

  1. Добавьте некоторое ведение журнала, используя EventLog или каркас ведения журнала (Log4Net).
  2. Запустите свой сервис как консольное приложение и отладьте его в Visual Studio
1 голос
/ 28 сентября 2010

Во-первых, убедитесь, что код вашего приложения работает нормально, когда он не настроен в качестве службы.Если ваш код работает нормально, когда не настроен как сервис, я предполагаю, что ваш OnStart занимает слишком много времени по какой-то причине.Если вы не можете ускорить его, информация здесь позволяет обработать необходимую задержку запуска.

В Win32 вам необходимо обновить статус службы , уведомив Диспетчер управления службами (SCM) озапуск (и остановка) происходит периодически, или он будет думать, что ваш сервис завис и убьет его.Возможно, вам придется сделать это только один раз или по таймеру, если ваша инициализация занимает много времени.Во время выполнения логики запуска (остановки) вы сообщаете SCM, что находитесь в состоянии START_PENDING (STOP_PENDING), и после того, как это будет сделано, вы сообщаете, что находитесь в состоянии STARTED (STOPPED).

В управляемом мире этоЦель достигается путем вызова ServiceBase.RequestAdditionalTime .Подробный обзор этой темы здесь .Денежная квота:

Именно здесь вашей управляемой службе необходимо уделять внимание, чтобы избежать SCM, помечающей вашу службу как не отвечающую.

  • Вам не нужно явно обновлятьштат;ServiceBase сделает это за вас, когда ваш метод OnStart или OnStop завершит выполнение
  • . Вам необходимо вызвать RequestAdditionalTime, если вы ожидаете, что метод OnX превысит время ожидания.
0 голосов
/ 29 сентября 2010

Хорошо, я понял. Я делал что-то глупое с файлом конфигурации, включая перемещение файла конфигурации .exeXML в неправильное место. Это привело к ошибке конфигурации, и сервису это не понравилось. Я получил это и работает сейчас, хотя. Так что спасибо за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...