我遇到了正在创建的应用程序的问题。我试图通过我的C#应用程序启动Windows服务。当我单击我的开始按钮时,看起来一切都会通过但是当我登录到服务器时,该服务仍然没有显示它正在运行。但是,第二次运行它时,我得到一个异常,说该服务的实例已在运行。当我登录服务器时,服务似乎停止了。有没有人见过这个?
这是我的代码。
try
{
while (reader.Read())
{
int timeoutMilliseconds = 1000;
string serviceName = reader["ServiceName"].ToString();
string permission = reader["Permission"].ToString();
if (permission == "E")
{
lblServStartSuccess.Visible = true;
ServiceController service = new ServiceController(serviceName);
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
else
{
lblServErrorStart.Visible = true;
}
}
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
编辑:以下是我在一项服务上收到的例外情况:
System.InvalidOperationException:Service Logical Disk Manager 在计算机上找不到行政服务'。'。 ---> System.ComponentModel.Win32Exception:指定的服务没有 作为已安装的服务存在---内部异常堆栈跟踪的结束
我知道该服务存在。我是否需要在服务前添加一些内容来告诉它要查看哪个服务器?
答案 0 :(得分:40)
如果您显示的代码在与服务运行的机器不同的机器上执行(如果不是这样,我不清楚您的注释),您需要在ServiceController中提供机器名称建筑工。
您是否有可能成功启动该服务,但不是您认为的机器上?这符合你描述的症状。
ServiceController service = new ServiceController(serviceName, serverName);
答案 1 :(得分:18)
以下是我在Window Service中的代码,该代码负责停止启动在同一服务器上运行的其他服务。
ServiceController controller = new ServiceController(serviceName);
if (controller.Status==ServiceControllerStatus.Running)
controller.Stop();
if (controller.Status==ServiceControllerStatus.Stopped)
controller.Start();
答案 2 :(得分:5)
这是一个老线程,但谷歌让我来到这里。即使在成功启动之后,我的服务仍然会被查询为已停止。 如果你添加
service.Refresh();
它将查询实际当前状态,而不是先前查询中的存储状态。我不知道它为什么会这样,但确实如此。
P.S。:我加了一分钟很长时间,仍然得到一个服务停止响应而没有刷新。
答案 3 :(得分:2)
public static void StartService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
try
{
int millisec1 = 0;
TimeSpan timeout;
// count the rest of the timeout
int millisec2 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec1));
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
catch (Exception e)
{
Trace.WriteLine(e.Message);
}
}
public static void StopService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
try
{
int millisec1 = 0;
TimeSpan timeout;
if (service.Status == ServiceControllerStatus.Running)
{
millisec1 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
}
}
catch (Exception e)
{
Trace.WriteLine(e.Message);
}
}
public static void RestartService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
try
{
int millisec1 = 0;
TimeSpan timeout;
if (service.Status == ServiceControllerStatus.Running)
{
millisec1 = Environment.TickCount;
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 (Exception e)
{
Trace.WriteLine(e.Message);
}
}
别忘了添加ServiceProcess作为referance 使用System.ServiceProcess;
答案 4 :(得分:2)
首先,您需要在项目参考中添加DLL(ServiceProcess)的引用,例如:
Right click on References in Solution Explorer -> Add Reference -> Assemblies ->
Framework -> System.ServiceProcess
然后在您的项目中添加ServiceProcess DLL:
using System.ServiceProcess;
之后使用此代码:
ServiceController service = new ServiceController(yourServiceName);
答案 5 :(得分:0)
试试service.Start();没有超时或waitforstatus并挂钩其事件以查看发生了什么。