use*_*084 0 c# windows-services
我有这个代码重新启动服务,但这不起作用.
我可以单独启动和停止但不重启,这涉及到我首先停止并启动服务.
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
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
它只是进入捕获部分.
我不知道我哪里错了.
有什么建议.??
更新:
所以我从下面的正确答案中得出了这个想法:
这是需要做的事情>
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);
}
}
Run Code Online (Sandbox Code Playgroud)
有一个空的捕获块捕获所有异常很少是一个好主意,因为严重的问题很容易漏掉.
修改你的代码至少在catch块中做一些记录,例如
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.ToString());
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在服务的构造函数中附加跟踪侦听器,也可以使用Sysinternals中的DebugView工具来读取跟踪消息.如果您想更进一步,可能需要在项目中包含log4net等日志库.
我的猜测是你得到的是TimeoutException
因为停止服务所需的时间比预期的要长.您是否尝试通过删除超时参数来增加超时或无限等待?
更新:
您可能需要检查您的服务是否已启动:
if (!(service.Status.Equals(ServiceControllerStatus.Stopped)
|| service.Status.Equals(ServiceControllerStatus.StopPending)))
{
service.Stop();
}
service.Start();
Run Code Online (Sandbox Code Playgroud)