2013-03-03 156 views
2

我想重新启动名为“后台打印程序”的窗口服务我做了下面的代码,但没有运气,任何机构有什么关于发生了什么错误? 代码如何重新启动窗口服务

using System.ServiceProcess; 

ServiceController service = new ServiceController("Spooler"); 

if ((service.Status.Equals(ServiceControllerStatus.Stopped)) || 
    (service.Status.Equals(ServiceControllerStatus.StopPending))) 
{ 
    service.Start(); 
} 
else 
{ 
    service.Stop(); 
    service.Start(); 
} 

例外是

“System.InvalidOperationException: '' 无法启动服务 计算机后台处理程序---> System.ComponentModel.Win32Exception:服务的一个实例 已经在System.ServiceProcess.Service运行

---内部异常堆栈跟踪的结尾---

Controller.Start(字串[] args)

在System.ServiceProcess.ServiceController.Start()

在servicerestart.Form1.button1_Click(对象发件人,EventArgs的) 在d:\ samplecodes \ servicerestart \ servicerestart \ Form1.cs中:33" 行

+2

'但没有运气'不是一个非常准确的问题描述。你能否对不涉及运气或上帝的问题进行更具体的描述,但涉及具体的错误信息或不良行为。 – 2013-03-03 08:23:00

+1

@Darin Dimitrov我已更新我的问题 – vettori 2013-03-03 08:28:47

回答

9

您必须等待再次启动它使用WaitForStatus方法之前停止服务后:

else 
{ 
    service.Stop(); 
    service.WaitForStatus(ServiceControllerStatus.Stopped); 
    service.Start(); 
    service.WaitForStatus(ServiceControllerStatus.Running); 
} 
+1

它看起来可以工作,但我没有看到该服务停止并从服务小程序(SCM)开始。我们是否有任何机制能够迅速制止并立即开始? – vettori 2013-03-03 08:38:45

+0

不,这是在.NET中启动和停止服务的正确方法。服务启动后您可能还会等待。 – 2013-03-03 08:40:04

+0

我不想在.Start();方法,将会有一个ServiceControllerStatus.Started方法。有编译错误 – vettori 2013-03-03 08:44:46

0

我认为问题是你需要管理员权限来启动和停止服务,这就是为什么你必须提供所需的权利。

要做到这一点去改变ISS中的应用程序池的身份到LocalSystem。

希望这个帮助