2012-04-16 74 views
0

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

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

当我尝试通过将代码附加到service 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。

感谢,

卡迈勒

+1

服务线程是否在任何地方包含Thread.Join()?任何其他可避免的硬锁阻塞等待?如果是这样,让它消失。 – 2012-04-16 09:46:02

+0

..并确保所有非主要工作线程的Thread.IsBackground设置为true,除非那些绝对需要清除清理的线程。 OnStart方法中的 – 2012-04-16 10:04:32

+0

我无法调用thread.join。 onStartThread应该保持运行,每30秒轮询一次。所以我唯一的选择是在服务停止时放弃OnStartThread。 – 2012-04-16 10:13:54

回答

0

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

当这种睡眠不存在时,过程将开始,但我无法在OnStop方法上达到断点,因为进程(exe)已经开始,但它需要更多的资源才能完全启动并保持一致, thread.sleep提供所需的资源以便exe完全启动。

//the code is in OnStartThread 

someProcess.start(); Thread.Sleep(1000);

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 
} 
+0

我做了这个附加处理> OnStart方法的工作,但是当我停止服务OnStop方法没有被调用。断点保持禁用状态 – 2012-04-16 09:52:38