我有这个代码重启服务,但这不起作用。
我可以单独启动和停止但不重启,这涉及到我首先停止并启动服务。
try
{
//service.Stop();
//service.Start();
int millisec1 = Environment.TickCount;
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
// count the rest of the timeout
int millisec2 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1));
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
catch
{
// ...
}
它只是进入捕获部分。
我不知道我哪里出错了。
任何建议。??
更新:
所以我从下面的正确答案中得出了这个想法:
这是需要做的事情>
public static void RestartService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
int millisec1 = Environment.TickCount;
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
if (!(service.Status.Equals(ServiceControllerStatus.Stopped) || service.Status.Equals(ServiceControllerStatus.StopPending)))
{
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
}
// count the rest of the timeout
int millisec2 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1));
if (!(service.Status.Equals(ServiceControllerStatus.Running) || service.Status.Equals(ServiceControllerStatus.StartPending)))
{
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
}
答案 0 :(得分:5)
有一个空的catch块可以捕获所有异常,因为严重的问题很容易漏掉。
将代码修改为至少在catch块中进行一些记录,例如
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.ToString());
}
然后,您可以在服务的构造函数中附加跟踪侦听器,也可以使用Sysinternals中的DebugView工具来读取跟踪消息。如果您想更进一步,可能需要在项目中包含log4net等日志库。
我的猜测是你得到TimeoutException
,因为停止服务需要的时间比预期的要长。您是否尝试通过删除超时参数来增加超时或无限等待?
<强>更新强>
您可能需要检查您的服务是否已启动:
if (!(service.Status.Equals(ServiceControllerStatus.Stopped)
|| service.Status.Equals(ServiceControllerStatus.StopPending)))
{
service.Stop();
}
service.Start();