2010-09-15 125 views
6

我是使用Windows服務的完整初學者。我有一個基本的框架制定了服務,我目前在做這樣的:如何從Windows服務運行exe文件,並在exe程序退出時停止服務?

protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 
     Process.Start(@"someProcess.exe"); 
    } 

剛剛火過的exe在程序的開始。

但是,我想從exe退出進程時停止服務本身。 我很確定我需要做某種線程(我也是一個初學者),但是我不確定它是如何工作的總體輪廓,也不是從本身阻止進程的具體方式。 你能幫我解決這個問題的一般過程嗎(即從OnStart開始一個線程,然後什麼......?)?謝謝。

回答

9

您可以使用BackgroundWorker作爲線程,使用Process.WaitForExit()等待進程終止,直到您停止服務。

你是對的,你應該做一些線程,在OnStart做大量的工作可能會導致啓動服務時無法從Windows正確啓動的錯誤。

protected override void OnStart(string[] args) 
{ 

    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerAsync(); 
} 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Process p = new Process(); 
    p.StartInfo = new ProcessStartInfo("file.exe"); 
    p.Start(); 
    p.WaitForExit(); 
    base.Stop(); 
} 

編輯 您可能還需要到Process p移動到一個類的成員,並在OnStop停止該過程,以確保您可以再次停止該服務,如果EXE進入瘋狂。

protected override void OnStop() 
{ 
    p.Kill(); 
} 
+0

謝謝,這與我所希望的完全一樣。 – xdumaine 2010-09-15 18:40:53

1

someProcess.exe應該有someLogic停止呼叫服務;)

使用ServiceController類。

// Toggle the Telnet service - 
// If it is started (running, paused, etc), stop the service. 
// If it is stopped, start the service. 
ServiceController sc = new ServiceController("Telnet"); 
Console.WriteLine("The Telnet service status is currently set to {0}", 
        sc.Status.ToString()); 

if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) || 
    (sc.Status.Equals(ServiceControllerStatus.StopPending))) 
{ 
    // Start the service if the current status is stopped. 

    Console.WriteLine("Starting the Telnet service..."); 
    sc.Start(); 
} 
else 
{ 
    // Stop the service if its status is not set to "Stopped". 

    Console.WriteLine("Stopping the Telnet service..."); 
    sc.Stop(); 
} 

// Refresh and display the current service status. 
sc.Refresh(); 
Console.WriteLine("The Telnet service status is now set to {0}.", 
        sc.Status.ToString()); 

代碼見從以上鍊接頁面。

+0

謝謝,這看起來好像會達到最終結果 - 如果我正在開發exe文件。雖然這不是解決方案的更多解決方法嗎?而且它只會在假設我正在編寫.exe的情況下起作用。假設我無法訪問exe的源代碼,並且這應該仍然可以通過Windows服務本身來實現。 – xdumaine 2010-09-15 18:20:45

2

你必須使用一個ServiceController做到這一點,它有一個Stop方法。確保您的服務將CanStop屬性設置爲true。

相關問題