我很久以前就和windows服務有類似的問題,並能通過調用WaitForStatus(ServiceControllerStatus)
方法解決它。該服務需要一段時間才能關閉,並且在服務完全停止之前繼續進行。編寫卸載邏輯以及當Shutdown
狀態已停止時您想要執行的操作。
如果您正在卸載並且想要在卸載前停止服務,那麼您需要重寫卸載自定義操作,添加代碼以停止它,然後致電base.Uninstall
。 請記住,具有15秒限制的WaitForStatus
可能沒有足夠的時間讓服務關閉,具體取決於它在響應中的響應程度以及它在關機中的功能。另外請確保您撥打 ServiceController
(或如本例所示關閉),因爲如果您不這樣做,那麼內部服務句柄將不會立即釋放,並且如果它仍在使用中,則服務無法卸載。
MSDN link
這是如何實現這一點的,並記錄在事件記錄器只例如:
public override void Uninstall(System.Collections.IDictionary savedState)
{
ServiceController controller = new ServiceController("My Service");
try
{
if (controller.Status == ServiceControllerStatus.Running | controller.Status == ServiceControllerStatus.Paused)
{
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 0, 30));
controller.Close();
}
}
catch (Exception ex)
{
string source = "My Service Installer";
string log = "Application";
if (!EventLog.SourceExists(source))
{
EventLog.CreateEventSource(source, log);
}
EventLog eLog = new EventLog();
eLog.Source = source;
eLog.WriteEntry(string.Concat(@"The service could not be stopped. Please stop the service manually. Error: ", ex.Message), EventLogEntryType.Error);
}
finally
{
base.Uninstall(savedState);
}
}
感謝焉。 我已經有東西了,請看下面的代碼: ServiceController controller = new ServiceController(this。_mtlTestServiceName); 嘗試 { 如果(controller.Status == ServiceControllerStatus.Running | controller.Status == ServiceControllerStatus.Paused) { controller.Stop(); controller.WaitForStatus(ServiceControllerStatus.Stopped,new TimeSpan(0,0,0,15)); controller.Close(); } } 但到目前爲止沒有用:( – user2003520