0

我有一个 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。

4

2 回答 2

0

尝试Debugger.Break();在要中断执行的地方使用。或通过菜单附加到 Windows 服务进程Debug > Attach to process并在 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
}
于 2012-04-16T09:29:38.400 回答
0

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

当此睡眠不存在时,进程将启动,但我无法在 OnStop 方法上打断点,因为进程(exe)已启动,但它需要更多资源才能完全启动并保持一致并将 thread.sleep 给exe 完全启动所需的资源。

    //the code is in OnStartThread 

someProcess.start(); 线程.睡眠(1000);

于 2012-04-20T17:58:49.773 回答