窗口服务OnStop没有被调用

时间:2012-04-16 09:23:01

标签: c# multithreading windows-services

我有一个C#Windows服务。当我试图阻止它进入停止状态时,当我在onStop方法中放置断点时,它没有被击中。无法调试什么是问题。我已经在整个服务中添加了异常处理,还有未处理的异常处理,但我没有收到任何错误。每个东西都可以使用它将canStop设置为true并且还使用RequestAdditionalTime()的服务。

我还在app.config中设置了legacyUnhandledExceptionPolicy enabled =“true”。 对我来说,它看起来像是一些阻止服务控制管理器调用OnStop方法的线程/资源问题。或者服务可能处于已损坏状态,服务控制管理器无法阻止它。它只是将状态从停止改为停止。

当我通过将代码附加到服务exe来尝试调试时,尝试停止服务时没有任何反应。 onstop方法没有被调用。

在Onstart方法中,启动一个每隔30秒继续进行一次轮询的线程。假设onStop方法被调用,那么它将中止该线程。这就是这项服务的开发方式。

如果存在一些线程问题,或者OnStart方法中的线程是否阻塞了可用于服务控制管理器的资源,是否有一些可用于调试的免费工具?

OnStop方法中的代码:

try
{
    RequestAdditionalTime(10*60*1000);
    IntPtr handle = this.ServiceHandle;
    KServiceStatus.currentState = (int) State.SERVICE_START_PENDING;
    SetServiceStatus(handle, ref KServiceStatus);

    RequestAdditionalTime(30000);

    if ((onStartThread == null) ||
         ((onStartThread.ThreadState &
          (ThreadState.Unstarted | ThreadState.Stopped)) != 0))
    {
        onStartThread = new Thread(new ThreadStart(KWindowsServiceHandler.OnStart));
        onStartThread.Start();
    }

    KServiceStatus.currentState = (int) State.SERVICE_RUNNING;
    SetServiceStatus(handle, ref KServiceStatus);
 }              

OnStartThread继续运行,直到服务正在运行。它需要进行投票。 如果onStop方法被调用(未被调用)将中止此OnStartThread。

2 个答案:

答案 0 :(得分:0)

尝试在您想要中断执行的位置使用Debugger.Break();。或者通过菜单Debug > Attach to process附加到Windows服务进程并在Visual Studio中设置断点。

更新:如果调试器没有附加到进程,你可以这样做

if (!Debugger.IsAttached)
    Debugger.Launch();

为什么不使用System.Threading.Timer每30秒进行一次轮询?

protected override void OnStart(string[] args)
{
    const int period = 30 * 1000;
    Timer timer = new Timer(TimerCallback, null, 0, period);
}

private void TimerCallback(object state)
{
    // Polling goes here
}

答案 1 :(得分:0)

主要问题是找出问题所在。所以继续评论和取消注释代码的不同部分,发现真正的问题.OnStartthread启动一个进程(启动一个exe)所以我只是在我的Windows服务中保留这些代码并删除所有内容,我能够重现问题。所以我做的是让OnStartthread在启动过程后休眠1秒。 (更合适的是启动流程并捕获不同的事件以了解流程的状态以及何时准备好移动)它就像魔术一样工作。 这在某种程度上解决了我所面临的问题。

当这个睡眠不存在时,那么进程就会启动但是我无法在OnStop方法上达到断点,因为进程(exe)已经启动但它需要更多资源才能完全启动并保持一致并放置线程.sleep为exe提供所需的资源以便完全启动。

    //the code is in OnStartThread 

someProcess.start(); Thread.sleep代码(1000);

相关问题