2009-09-17 63 views
1

我最近接管了一个旧的Windows服务,它已被写入系统事件日志以下事件:窗口服务和C#设计模式的问题

事件ID:7034
说明: 为MyService服务意外终止了 。它完成了这个X 时间(s)。

我一直在寻找了源代码,发现在服务类库下面的代码模式: (它已被简化为保护无辜者。)

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

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

所谓这个编码彭定康并可能导致Windows服务关闭(即内存泄漏)?

+1

OH-MY-GOD !!!为什么使用递归调用而不是while循环?! – 2009-09-17 20:25:39

+12

投票结束为“属于thedailywtf.com” – 2009-09-17 20:28:27

回答

1

这是一个递归调用,最终会打击堆栈。

+1

......除非它有我们没有看到的有条件退出。 – 2009-09-17 20:27:32

+0

代码中没有条件退出。 – 2009-09-17 20:59:04

+0

@迈克尔:没关系,这不是一个递归调用技术的地方。 – 2009-09-20 18:58:35

3

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

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

0

这是一个递归调用,显然没有退出条件。最终由于致电ManageCycle永远不会返回,它将用完堆栈。

另外,StartService方法永远不会返回,它应该至少将一个前景线程串起来然后返回。

0

递归,它像递归调用自己一样。我很惊讶没有堆栈溢出异常。运行此服务器的机器上的服务属性可能配置为在发生故障时重新启动服务。

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

它是递归的好吧。它会不断地重复调用自己(一件坏事),并且会导致一个堆栈溢出。

“//做些什么”做什么?也许有一个很好的理由,它自己调用, b但是没有办法摆脱循环(递归),应用程序将退出。

+0

//做一些东西一块服务调用数据库来检索监视器的集合,以检查网页的健康状况,Windows服务,硬盘驱动器容量以及是否可以ping通设备。 – 2009-09-17 21:21:02

1

这种情况的最佳答案: 除非您的算法具有递归结构,否则不要使用递归算法。例如,如果你正在分析文件系统,并希望扫描特定的目录,你会想要做的事,如:

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

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

+0

+1这是这个问题的正确结论。这更像是“如何正确编码?”问题比“如何实现代码完美?”题。 – 2009-09-18 12:42:20