【问题标题】:Window Service and C# design pattern question窗口服务和 C# 设计模式问题
【发布时间】:2009-09-17 20:23:46
【问题描述】:

我最近接管了一个旧版 Windows 服务,它一直在系统事件日志中写入以下事件:

事件 ID:7034
描述: MyService 服务终止 不料。它已经完成了这个 X 时间。

我正在查看源代码,并在服务类库中发现了以下代码模式: (为了保护无辜者,已经简化了..)

public static void StartService()
{
    //do some stuff...
    ManageCycle();
}

public static void ManageCycle()
{
   //do some stuff
   ManageCycle();
}

这个编码模式叫什么,它是否可能导致 Windows 服务关闭(即内存泄漏)?

【问题讨论】:

  • 天啊!!!为什么使用递归调用而不是 while 循环?!
  • 投票结束“属于 thedailywtf.com”

标签: c# design-patterns windows-services coding-style


【解决方案1】:

这看起来像堆栈溢出异常模式。艾伦是正确的。使用 while 循环:

公共静态无效StartService() { //做一些事情... isRunning = true; 管理循环(); } 公共静态无效管理循环() { 而(正在运行) { //做一些事情并包装异常处理 } } 公共静态无效停止服务() { isRunning=假; }

【讨论】:

    【解决方案2】:

    它假设抛出 StackOverflow (HA HA :) ) 异常,因为无休止的递归调用。

    看看this example - 你应该选择适合你架构的技术。

    【讨论】:

      【解决方案3】:

      这是一个递归调用,最终会破坏堆栈。

      【讨论】:

      • ...除非它有一个我们没有看到的条件退出。
      • @Michael:没关系,这不是递归调用技术的地方。
      【解决方案4】:

      这种情况的最佳答案: 除非您的算法具有递归结构,否则不要使用递归算法。例如,如果您正在分析一个文件系统,并且想要扫描一个特定的目录,您可能需要执行以下操作:

      void ScanDirectory(Directory)
      {
          // Handle Files
          if (currfile.directory)
              ScanDirectory(currfile)
      }
      

      这是有道理的,因为它比迭代更容易。但否则,当你只是一遍又一遍地重复一个动作时,让它成为递归是完全没有必要的,并且会导致代码效率低下并最终导致堆栈溢出。

      【讨论】:

      • +1 这是这个问题的正确结论。它更像是“如何编码正确?”问题比“如何实现代码完美?”问题。
      【解决方案5】:

      这是一个递归调用,显然没有退出条件。最终它将耗尽堆栈,因为对 ManageCycle 的调用永远不会返回。

      另外 StartService 方法永远不会返回,它应该至少启动一个前台线程然后返回。

      【讨论】:

        【解决方案6】:

        递归,它看起来像是在递归调用自己。我很惊讶没有堆栈溢出异常。也许运行它的机器上的服务属性配置为在失败时重新启动服务。

        【讨论】:

          【解决方案7】:

          它是递归的。它会不断重复调用自己(一件坏事),这将导致堆栈溢出。

          “//做一些事情”是做什么的?也许它自称是有充分理由的, b但是如果没有办法退出循环(递归),应用程序就会退出。

          【讨论】:

          • //do some stuff 服务调用数据库来检索监视器集合以检查网页的健康状况、Windows 服务、硬盘容量以及设备是否可 ping。
          猜你喜欢
          • 1970-01-01
          • 2014-12-26
          • 1970-01-01
          • 1970-01-01
          • 2012-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多