Тайм-аут запуска сервера - PullRequest
       5

Тайм-аут запуска сервера

1 голос
/ 22 сентября 2009

Я нашел этот пост,

Тайм-аут запуска службы Windows

Но просто хотел уточнить, я написал службу Windows на C # .NET, которая время от времени выдает ошибки тайм-аута, например,

Превышено время ожидания (30000 миллисекунд) .... при запуске службы

Причина в том, что он выполняет некоторые действия WCF в методе запуска, который работает в большинстве случаев нормально, но если ваш компьютер, например, зависает при запуске, это может привести к тому, что это займет немного больше времени. Теперь я понимаю, что код не должен быть так структурирован.

Является ли приемлемым решением для запуска фонового потока из метода запуска и завершения там работы WCF?

Спасибо.

1 Ответ

1 голос
/ 22 сентября 2009

Как и все приложения, служба Windows имеет точку входа. В C # это называется Main () и является статическим методом в некотором классе. Внутри функции Main () вашей службы Windows у вас должно быть что-то похожее на это:

ServiceBase[] ServicesToRun = new ServiceBase[] { new MyWindowsService() };
ServiceBase.Run( ServicesToRun );

В этом примере MyWindowsService - это имя класса обслуживания Windows, который нужно запустить, и его следует заменить любым именем класса обслуживания Windows.

Когда этот код выполняется в Main (), будет вызван конструктор по умолчанию для вашего класса обслуживания Windows, который выглядит примерно так:

public MyWindowsService()
{
    // service instance initialization goes here...
}

Здесь вы можете инициализировать экземпляр MyWindowsService.

Теперь класс MyWindowsService должен быть производным от System.ServiceProcess.ServiceBase. Если это так, то вы можете переопределить метод OnStart (), который вызывается, когда диспетчер управления службами отправляет в службу команду запуска.

protected override void OnStart(string[] args)
{
    // things to do when starting the service...
}

Как только функция OnStart () возвращается, ваша служба эффективно работает, т.е. запущена.

Итак, вопрос в том, где в этой цепочке событий происходит ваша задержка - в Main (), конструкторе службы или методе обратного вызова OnStart (). Вы пытались отладить свой сервис? Самый простой способ сделать это - поместить следующую строку кода в функцию Main () вашего сервиса:

System.Diagnostics.Debugger.Break();

Когда вы запустите службу, вам будет предложено выбрать отладчик. Просто выберите новый экземпляр Visual Studio, и вы перейдете прямо в код в тот момент, когда выполняется этот вызов Break (). Оттуда можно отлаживать, устанавливая точки останова в соответствующих местах (конструктор, OnStart ()), чтобы увидеть, где происходит зависание.

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