我使用以下函数来停止我的Windows服务(超时):
public int StopService()
{
ServiceController service = new ServiceController(serviceName);
try
{
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
return 1;
}
catch (Exception ex)
{
logger.Log(LoggingLevel.Error,
this.GetType().Name + ":" + MethodBase.GetCurrentMethod().Name,
string.Format("{0}", ex.Message));
return -1;
}
}
我检查服务的状态。如果不是ServiceControllerStatus.Stopped
,我会调用此函数。
我已经测试过,当服务器的状态为正在运行或已停止时,程序正常运行。但我想知道当状态是其他状态时会发生什么,例如 StopPending , StartPending 等。如果我告诉我的服务停止状态是其中一个状态上面,Stop命令是否仍然可以正常工作?
答案 0 :(得分:0)
这取决于服务以及在调用Stop()时它允许的内容。
在Win32级别,每个服务必须定期调用SetServiceStatus()以通知服务控制管理器(SCM)它将接受哪些命令。只有当服务明确表示允许该操作时,您对Stop()的调用才会成功。根据我的经验,处于挂起状态的服务通常不允许正常的操作范围,因此对Stop()的调用可能会失败。
请注意,很容易检查C#中允许的内容,如sample code under the Examples heading所示。您可以使用CanStop()为Stop()添加前缀,如果服务还没有准备好停止,可能需要等待一段时间。突发事件比比皆是。
答案 1 :(得分:0)
您可以尝试以下方式,以下是StopPending的示例,
while (service.Status == ServiceControllerStatus.StopPending) //If it is stop pending, wait for it
{
System.Threading.Thread.Sleep(30 * 1000); // thread sleep for 30 seconds
service.Refresh(); // refreshing status
if (service.Status == ServiceControllerStatus.Stopped)
{
Comments = "Service " + serviceName + " stopped successfully. ";
}
}
让我知道它是否有效。如果您有(有)更好的解决方案,请另外提供