重启后,Windows服务的执行方式不同

时间:2013-06-17 19:04:07

标签: c# .net visual-studio-2010 service pinvoke

我可能在解决Windows服务或生活本身的行为方面存在问题。

问题:

该服务无法停止,并且尽管已设置,但未触发恢复操作。 该服务在ServiceHelper。ChangeStartMode方法调用

之后停止
try
{                       
    normalnekurwalogowanie(Constants.Values.service_name);
    ServiceController svc = new ServiceController(Constants.Values.service_name);
    if (svc != null)
    {                            
        ServiceHelper.ChangeStartMode(svc, (automatic ? ServiceStartMode.Automatic : ServiceStartMode.Manual));
        svc.Close();
    }
    else
        normalnekurwalogowanie("null");
}
catch (Exception ex)
{
    //Logger.Instance.Error("Error message: {0}\nError Stack Trace: {1}", new object[] { ex.Message, ex.StackTrace });
    normalnekurwalogowanie(ex.ToString());
}

在我的日志文件中出现错误Open Service Manager ErrorUnable to open Service Manager

现在,几个有趣的事实:   - 如您所见,异常被捕获并打印到文件但服务已停止   - 重启后才发生错误;系统重启前服务安装后不会发生此事

解决方案:

我删除了对外部Logger类的引用(不是我写的,我没有代码)后问题就消失了。我不知道为什么。

问题:

  • 捕获的异常如何仍然使服务崩溃(并且在某种程度上不执行恢复操作)?
  • 重启后代码的执行方式如何?它完全相同。

即使外部类可能对我的代码产生影响,它也不会在引发异常的行之前的任何地方调用。 BTW winforms app中使用的externall类工作正常,在重启之前服务正常。< / em>的

我将尝试获取外部类代码并更新问题。

1 个答案:

答案 0 :(得分:1)

  

捕获的异常如何仍然使服务崩溃(并且在某种程度上不执行恢复操作)?

原始异常可能不会使服务崩溃,但如果您的第一个异常处理程序中有第二个异常,则该服务将崩溃。我会通过在其周围放置一个try / catch来检查Logger.Instance.Error()是否抛出异常。

  

重启后代码的执行方式如何?它完全相同。

虽然它可能与您的代码中的序列相同,但我们不知道在上次崩溃之前磁盘上剩余的剩余状态。这可能是产生差异的原因。