我通过从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没有被调用,我的进程突然终止。谁能告诉我我做错了什么?
答案 0 :(得分:0)
我回答了自己的问题。我决定在循环中使用一个简单的sleep(),同时等待进程完成清理,所以我不会使用ServiceStatus。
看来,一旦你从OnStop()返回,你就会无条件终止,但这只是猜测。
答案 1 :(得分:0)
我知道这不完全是你所需要的,但伙计,我只是想出了一个非常好的替代方案......
[选项#1]: 在注册表中创建一个标志/键,然后其他程序可以监视该标志或等待它并自行删除它。
[选项#2]: 如果按下 F13-F24 等虚拟键 (VK_#),您可以监视它们(但有些键会执行某些操作,因此请选择不执行任何操作的键,例如 F13-F14)。让你的服务按下这个 VK 几秒钟然后释放,同时它被按下,你的其他需要反馈的进程可以监控 VK。
[选项#3]: 让你的服务在某处创建一个描述你需要的特定名称的文件,另一个进程会等待文件出现并在他看到时自行删除(或者服务会在超时后删除文件)。< /p>