簡體   English   中英

無法在.NET 3.5中使用ServiceController停止服務

[英]Cannot stop the service using ServiceController in .NET 3.5

我在.NET 3.5中工作,使用ServiceController停止某些服務時遇到問題。 我搜索了整個互聯網,但沒有找到解決問題的辦法;)

這是我的方法:

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的Virtual Box中運行此應用程序(和此服務)。 (我需要在其他計算機而非計算機上運行它)。

有什么想法可以解決這個問題嗎? ;)

謝謝你的幫助。

最好的祝福,皮特。

好,我解決了我的問題。

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

 service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

也可以很好地工作,因為它可以即時更改服務的狀態(這只是Windows Services列表中的一項更改),但是使用某些Service禮貌地關閉所有線程需要一些時間:)

因此,您需要做的就是等待,然后再次檢查它是否仍在運行。 如果是這樣,則使用Process類將其殺死。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM