窗口服务和C#设计模式问题

时间:2009-09-17 20:23:47

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

我最近接管了一个传统的Windows服务,它已经在系统事件日志中编写了以下事件:

  

事件ID:7034
描述:The   MyService服务终止   不料。它做了这个X.   时间(s)。

我正在查看源代码,并在服务类库中找到以下代码模式: (它已被简化以保护无辜的人。)

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

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

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

7 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

这看起来像堆栈溢出异常模式。伊兰是对的。使用while循环:

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

public static void ManageCycle()
{
   while(isRunning)
   {
   //do some stuff and wrap in exception handling
   }
}

public static void StopService()
{
    isRunning=false;
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

“做一些事”是做什么的?也许有一个很好的理由,它自称, bBut没有办法退出循环(递归),应用程序将退出。