我已经构建了一个Windows服务来监控我们服务器上的一些设置,我已经开发了很多WinForm和WPF应用程序,但是对于Windows服务我是一个绝对的新手,这就是为什么我使用msdn并遵循关于how to create a simple service的教程。现在我可以安装该服务并使其运行,但只有当我从微软教程中删除一些零碎的东西时...但我很好奇为什么,当我按照教程,我的服务在启动时出现意外错误。
经过一些测试后,服务似乎在SetServiceStatus()的onstart方法中崩溃了
public partial class MyService: ServiceBase
{
private static ManualResetEvent pause = new ManualResetEvent(false);
[DllImport("ADVAPI32.DLL", EntryPoint = "SetServiceStatus")]
public static extern bool SetServiceStatus(IntPtr hServiceStatus, SERVICE_STATUS lpServiceStatus);
private SERVICE_STATUS myServiceStatus;
private Thread workerThread = null;
public MyService()
{
InitializeComponent();
CanPauseAndContinue = true;
CanHandleSessionChangeEvent = true;
ServiceName = "MyService";
}
static void Main()
{
// Load the service into memory.
System.ServiceProcess.ServiceBase.Run(MyService());
}
protected override void OnStart(string[] args)
{
IntPtr handle = this.ServiceHandle;
myServiceStatus.currentState = (int)State.SERVICE_START_PENDING;
**SetServiceStatus(handle, myServiceStatus);**
// Start a separate thread that does the actual work.
if ((workerThread == null) || ((workerThread.ThreadState & (System.Threading.ThreadState.Unstarted | System.Threading.ThreadState.Stopped)) != 0))
{
workerThread = new Thread(new ThreadStart(ServiceWorkerMethod));
workerThread.Start();
}
myServiceStatus.currentState = (int)State.SERVICE_RUNNING;
SetServiceStatus(handle, myServiceStatus);
}
}
现在,当我注释掉SetServiceStatus()
行时,我的服务似乎运行得很好。为什么这会失败?这是一个权利问题,还是我完全忽略了这一点?
答案 0 :(得分:4)
通常,在使用框架实现托管服务时,您不必调用SetServiceStatus
。
话虽如此,如果您确实调用它,则需要在使用之前完全初始化 SERVICE_STATUS
。您目前只设置状态,但none of the other variables。
SetServiceStatus
的最佳做法中建议:“初始化SERVICE_STATUS
结构中的所有字段,确保有待处理状态的有效检查点和等待提示值。使用合理的等待提示。“