繁体   English   中英

以编程方式启动 Windows 服务

[英]Start Windows Service programmatically

我正在创建的应用程序有问题。 我正在尝试通过我的 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:在计算机“。”上找不到服务逻辑磁盘管理器管理服务。 ---> System.ComponentModel.Win32Exception:指定的服务不作为已安装的服务存在---内部异常堆栈跟踪结束

我知道服务存在。 我是否需要在服务前面添加一些东西来告诉它要查看哪个服务器?

如果您显示的代码在与服务应该运行的位置不同的机器上执行(我从您的评论中不清楚是否是这种情况),您需要在 ServiceController 构造函数中提供机器名称。

您是否有可能成功启动服务,但不是在您认为的机器上? 这符合你描述的症状。

ServiceController service = new ServiceController(serviceName, serverName);

另请参阅ServiceController构造函数文档

这是我在 Window 服务中的代码,该服务负责停止启动在同一服务器上运行的其他服务。

ServiceController controller = new ServiceController(serviceName);
if (controller.Status==ServiceControllerStatus.Running)
    controller.Stop();

if (controller.Status==ServiceControllerStatus.Stopped)
    controller.Start(); 

这是一个旧线程,但谷歌让我来到了这里。 我的服务,即使在成功启动后,仍然会在停止状态下查询。 如果你添加

service.Refresh();

它将查询实际的当前状态,而不是先前查询中存储的 state。 我不知道为什么它会这样工作,但确实如此。

PS:我添加了一分钟的时间,仍然得到服务停止响应而没有刷新。

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);
        }
    }

不要忘记使用 System.ServiceProcess 添加 ServiceProcess 作为参考;

首先,您需要在项目引用中添加 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);

试试 service.Start(); 没有超时或 waitforstatus 并挂钩其事件以查看发生了什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM