2009-02-25 11 views
8

Mam usługę windows, która uruchamia wątek w metodzie OnStart.Jak zatrzymać aplikację usługi systemu Windows z wątku?

Zasadniczo chcę być w stanie zatrzymać usługę, jeśli coś pójdzie nie tak (jak nieobsługiwany wyjątek).

Obecnie używam ServiceBase.Stop(), ale wymaga to wystąpienia instancji ServiceBase gdzieś widocznej dla wątku, co z kolei wymaga zadeklarowania mojej instancji jako public static w programie głównym.

Czy istnieje "lepszy sposób", aby zatrzymać usługę? Jeśli tak nie jest ... czy jest to bezpieczne?

Odpowiedz

10

Najprostszym i, moim zdaniem, najczystszym sposobem jest użycie statycznego własność publiczną klasy usług. Nie zadziała to tylko wtedy, gdy używasz tej samej klasy usług do uruchamiania wielu usług w tym samym procesie, co jest bardzo rzadkie.

private static MyService m_ServiceInstance; 

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

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

Wstrzykiwanie wystąpienie usługi do każdego sposobu, który mógłby ewentualnie potrzebne jest alternatywą, ale może szybko dostać niechlujny i nie ma realne korzyści nad tuż przy użyciu właściwości statycznych.

0

Zapoznaj się z example here, jak używać klasy ServiceController do uruchamiania i zatrzymywania usług.

Można również przekazać instancję usługi do wątku podczas jej tworzenia (lub ustawić jako instancyjną zmienną w klasie wątków itp.) Bez konieczności ustawiania klasy usług w sposób statyczny.

Krótki przykład dla kompletności:

ServiceController sc = new ServiceController("MyService"); 
sc.Stop(); 
+1

Nie sądzę, że mądrze jest założyć (we wszystkich przypadkach), że twoje konto usługowe będzie miało dostęp do menedżera sterowania usługami, z którego korzysta ServiceController. To właśnie chcesz kontrolować proces z zewnątrz, a nie dobre rozwiązanie IMO od środka. – jlew

+0

Bardzo dobry punkt. W takim przypadku sugerowałbym przekazanie instancji usługi do wątku lub jak sugerowałby to inny plakat, czyniąc go singletonem. –

Powiązane problemy