ServiceController状态未正确反映实际服务状态

时间:2012-08-30 07:39:55

标签: c# windows-services

如果我的服务正在启动或停止,我有这个代码运行PowerShell脚本。

Timer timer1 = new Timer();

ServiceController sc = new ServiceController("MyService");

protected override void OnStart(string[] args)
    {
        timer1.Elapsed += new ElapsedEventHandler(OnElapsedTime);
        timer1.Interval = 10000;
        timer1.Enabled = true;
    }

    private void OnElapsedTime(object source, ElapsedEventArgs e)
    {
        if ((sc.Status == ServiceControllerStatus.StartPending) || (sc.Status ==  ServiceControllerStatus.Stopped))
        {
            StartPs();
        }
    }

    private void StartPs()
    {
        PSCommand cmd = new PSCommand();
        cmd.AddScript(@"C:\windows\security\dard\StSvc.ps1");
        PowerShell posh = PowerShell.Create();
        posh.Commands = cmd;
        posh.Invoke();
    }

当我从cmd提示符中删除我的服务时,它工作正常 但即使我的服务启动并运行,powershell脚本也会继续执行(它会在计算机上附加一个文件) 知道为什么吗?

1 个答案:

答案 0 :(得分:33)

ServiceController.Status属性并不总是有效;它在第一次被要求时被懒惰地评估,但是(除非要求)那个时间;对Status 的后续查询通常不会检查实际服务。要强制执行此操作,请添加:

sc.Refresh();
.Status检查之前

private void OnElapsedTime(object source, ElapsedEventArgs e)
{
    sc.Refresh();
    if (sc.Status == ServiceControllerStatus.StartPending ||
        sc.Status == ServiceControllerStatus.Stopped)
    {
        StartPs();
    }
}

如果没有sc.Refresh(),如果最初为Stopped(例如),则总是Stopped