SetServiceStatus成功但似乎没有效果

时间:2016-11-15 21:36:08

标签: c# service

我通过从ServiceBase派生来跟踪此MSDN walkthrough来编写服务。它建议一种调用SetServiceStatus来指示SERVICE_STOP_PENDING的方法。我收集这意味着您的流程将被终止,直到您使用SERVICE_STOPPED进行调用。我重写了OnStop并添加了这段代码:

                checkpoint = 1;
                // Update the service state to Stop Pending.
                ServiceStatus serviceStatus = new ServiceStatus();

                serviceStatus.dwServiceType = ServiceType.SERVICE_WIN32_OWN_PROCESS;
                serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING;
                serviceStatus.dwControlsAccepted = 1;
                serviceStatus.dwWin32ExitCode = 0;
                serviceStatus.dwServiceSpecificExitCode = 0;
                serviceStatus.dwCheckPoint = checkpoint++;
                serviceStatus.dwWaitHint = 10000;

                SetLastError(0);
                if (!SetServiceStatus(this.ServiceHandle, ref serviceStatus))
                    TextOut("OnStop SetServiceStatus failed: " + Marshal.GetLastWin32Error());

                timer = new System.Timers.Timer();
                timer.Interval = 50;
                timer.Elapsed += timer_Elapsed;
                timer.Start();

然而,timer_Elapsed没有被调用,我的进程突然终止。谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:0)

我回答了自己的问题。我决定在循环中使用一个简单的sleep(),同时等待进程完成清理,所以我不会使用ServiceStatus。

看来,一旦你从OnStop()返回,你就会无条件终止,但这只是猜测。

答案 1 :(得分:0)

我知道这不完全是你所需要的,但伙计,我只是想出了一个非常好的替代方案......

[选项#1]: 在注册表中创建一个标志/键,然后其他程序可以监视该标志或等待它并自行删除它。

[选项#2]: 如果按下 F13-F24 等虚拟键 (VK_#),您可以监视它们(但有些键会执行某些操作,因此请选择不执行任何操作的键,例如 F13-F14)。让你的服务按下这个 VK 几秒钟然后释放,同时它被按下,你的其他需要反馈的进程可以监控 VK。

[选项#3]: 让你的服务在某处创建一个描述你需要的特定名称的文件,另一个进程会等待文件出现并在他看到时自行删除(或者服务会在超时后删除文件)。< /p>