2013-02-09 68 views
2

我工作在.net 3.5和我有停止使用ServiceController的一些服務的問題。我搜索整個互聯網,我發現沒有解決我的問題;)不能在.NET中停止使用的ServiceController服務3.5

我是這樣做的:

using (ServiceController service = new ServiceController("Service")) 
{ 
    try 
    { 
     TimeSpan timeout = TimeSpan.FromSeconds(timeoutSeconds); 

     service.Stop(); 
     service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
    } 
} 

我等待着,直到我的服務停止。然後我想替換它的庫(更新它)。拋出異常:

UnauthorizedAccessException 異常詳細信息:System.UnauthorizedAccessException:拒絕訪問路徑'blablabla'。

我敢肯定,我有機會獲得這條路,因爲我跑我的應用程序作爲管理員。

當這段代碼執行有趣的是,這個服務從當前服務列表(在任務管理器)消失。所以它實際上停止了它,但是一些線程仍然使用它,所以我不能移動任何服務的文件。即使我嘗試自己移動文件(我進入Service目錄並嘗試使用鼠標移動文件),我無法做到這一點。但是,當我手動停止服務(任務管理器和「結束任務」)時,我可以對其文件進行任何操作。那麼,停止使用C#代碼(使用ServiceController)並使用任務管理器停止它有什麼區別?

我不知道,如果它是重要的,但我運行此應用程序(這個服務)Windows Server 2008上的虛擬盒。 (我需要在其他機器上運行它,然後在我的電腦上運行它)。

任何想法我怎麼能解決這個問題? ;)

感謝您的幫助。

最良好的祝願, 皮特。

+0

之所以用'任務Manager'是因爲它已經有一個管理員令牌可以停止代碼。爲了讓您的應用程序操作'Service',您需要模擬或驗證您的應用程序是否處於適當的管理員級別。 這可以用'Windows主體Assembly'來完成。 您的其他選擇是啓動'Process'將運行的'淨Stop'管理員命令提示符命令停止'Service'。然後在完成它的任務後再次調用'Process'以重新開始。 – Greg 2013-02-09 00:21:01

+1

您沒有停止使用任務管理器的服務,你*把它打死了*。巨大差距。 – 2013-02-09 01:32:49

+0

@格雷格我想過這個問題,但我也認爲,如果我們有類似的ServiceController我就能用它來控制我的服務,但在這種情況下,我必須做的,你寫的,並使用「淨停止」 感謝所有的答案! – 2013-02-09 08:27:39

回答

4

好吧,我解決我的問題。

首先,我用的Net StopAdministrator Command-Prompt Command停止Service工作,但我開始想知道爲什麼。答案是花了很多時間! ServiceController實際上停止了,但某些進程仍在使用它。

service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 

而且workerd罰款,因爲它imidaitely改變了服務的狀態(這只是一個變化Windows Services列表),但收盤禮貌地使用某些服務的所有線程需要一些時間:)

所以你需要做的只是等待,然後再檢查它是否仍在運行。如果是,則用類別Process殺死它。