Как остановить приложение службы Windows из потока? - PullRequest
8 голосов
/ 25 февраля 2009

У меня есть служба Windows, которая запускает поток в методе OnStart.

По сути, я хочу иметь возможность остановить службу, если что-то пойдет не так (например, необработанное исключение).

В настоящее время я использую ServiceBase.Stop(), но это подразумевает наличие экземпляра ServiceBase где-то видимым для потока, что, в свою очередь, подразумевает объявление моего экземпляра как public static в основной программе.

Есть ли "лучший способ" остановить службу? Если это не так ... безопасно ли это делать таким образом?

Ответы [ 2 ]

10 голосов
/ 25 февраля 2009

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

private static MyService m_ServiceInstance;

public static MyService ServiceInstance
{
    get { return m_ServiceInstance; }
}

public MyService()
{
    InitializeComponents();
    //Other initialization
    m_ServiceInstance = this;
}

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

0 голосов
/ 25 февраля 2009

Посмотрите пример здесь о том, как использовать класс ServiceController для запуска и остановки служб.

В качестве альтернативы, вы можете передать свой экземпляр службы потоку при его создании (или установить его как переменную экземпляра в классе потока и т. Д.) Без необходимости делать статический класс обслуживания.

Краткий пример полноты:

ServiceController sc = new ServiceController("MyService");
sc.Stop();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...