C# Windows服务-启动时崩溃
我已经建立了一个windows服务来监控我们服务器上的一些设置,我已经开发了很多WinForm和WPF应用程序,但对于windows服务,我是一个绝对的新手,这就是为什么我求助于msdn并遵循本教程的原因。现在,我可以很好地安装该服务并使其运行,但前提是我要从microsoft教程中删去一些细节。。但我很好奇,为什么当我遵循教程时,我的服务在启动时会出现意外错误 经过一些测试,在SetServiceStatus()的onstart方法中,服务似乎崩溃了C# Windows服务-启动时崩溃,c#,windows,service,msdn,C#,Windows,Service,Msdn,我已经建立了一个windows服务来监控我们服务器上的一些设置,我已经开发了很多WinForm和WPF应用程序,但对于windows服务,我是一个绝对的新手,这就是为什么我求助于msdn并遵循本教程的原因。现在,我可以很好地安装该服务并使其运行,但前提是我要从microsoft教程中删去一些细节。。但我很好奇,为什么当我遵循教程时,我的服务在启动时会出现意外错误 经过一些测试,在SetServiceStatus()的onstart方法中,服务似乎崩溃了 现在,当我注释掉SetServiceSta
现在,当我注释掉
SetServiceStatus()
行时,我的服务似乎运行得很好。为什么会失败?这是一个权利问题还是我完全没有抓住要点?一般来说,在使用框架实现托管服务时,不必调用SetServiceStatus
也就是说,如果您调用它,您需要在使用它之前完全初始化服务\u状态。您当前仅设置状态,但是
最佳实践中建议:“初始化服务状态结构中的所有字段,确保挂起状态有有效的检查点和等待提示值。通常使用合理的等待提示。”,在使用框架实现托管服务时,不必调用SetServiceStatus
也就是说,如果您调用它,您需要在使用它之前完全初始化服务\u状态。您当前仅设置状态,但是
“初始化服务状态
结构中的所有字段,确保挂起状态有有效的检查点和等待提示值。使用合理的等待提示。”调用设置服务状态
有什么具体原因吗?这不是严格要求的,您可能只需要摆脱这些调用。您可以按照这里的简单教程制作一个简单的windows服务。您的服务工作不需要所有这些外部呼叫。[我没有具体的原因,只是想了解msdn,想知道它到底为什么会失败。你调用SetServiceStatus
有什么具体的原因吗?这不是严格要求的,你可能只需要摆脱这些调用。你可以按照这里的简单教程制作一个简单的windows服务。所有这些您的服务不需要rnal调用。[我没有具体的原因,只是想了解msdn,想知道它到底为什么会失败。事实上,他是这么说的。实现(并响应)事件,例如OnStart(),OnStop()),以及其他各种电源事件将根据您对这些事件的处理隐式管理您的服务的状态。您不需要任何外部人员/直接访问Win32 API来执行此处所述的操作。因此,一般来说,在创建这样的托管服务时,我不需要使用SetServiceStatus。如果我这样做了,那么还有一些我需要担心的事情。谢谢,你们在黑暗中给了我一些启示。干杯。事实上,是他说的。实施(和响应)活动,比如OnStart(),OnStop(),以及其他各种电源事件将根据您对这些事件的处理隐式管理您的服务的状态。您不需要任何外部人员/直接访问Win32 API来执行此处所述的操作。因此,一般来说,在创建这样的托管服务时,我不需要使用SetServiceStatus。如果我这样做了,那么还有一些事情我需要担心。谢谢,你们在黑暗中给我点启示。干杯。
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);
}
}