我最近接管了一个传统的Windows服务,它已经在系统事件日志中编写了以下事件:
事件ID:7034
描述:The MyService服务终止 不料。它做了这个X. 时间(s)。
我正在查看源代码,并在服务类库中找到以下代码模式: (它已被简化以保护无辜的人。)
public static void StartService()
{
//do some stuff...
ManageCycle();
}
public static void ManageCycle()
{
//do some stuff
ManageCycle();
}
这个编码模式叫什么,可能导致Windows服务关闭(即内存泄漏)?
答案 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没有办法退出循环(递归),应用程序将退出。