Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
窗口服务与C#设计模式问题_C#_Design Patterns_Windows Services_Coding Style - Fatal编程技术网

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

窗口服务与C#设计模式问题,c#,design-patterns,windows-services,coding-style,C#,Design Patterns,Windows Services,Coding Style,我最近接管了一个旧版windows服务,它一直在系统事件日志中写入以下事件: 事件ID:7034描述:事件 MyService服务终止 意外地它做到了这一点 时间 我查看了源代码,在服务类库中发现了以下代码模式: (为了保护无辜,它被简化了) 这种编码模式叫什么?它是否可能导致windows服务关闭(即内存泄漏) 这是一个递归调用,最终会毁掉堆栈。这是一个递归调用,最终会毁掉堆栈。由于无休止的递归调用,它假设抛出StackOverflow(HA:)异常 看看-您应该选择适合您的体系结构的技术。由

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

事件ID:7034
描述:事件 MyService服务终止 意外地它做到了这一点 时间

我查看了源代码,在服务类库中发现了以下代码模式: (为了保护无辜,它被简化了)


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

这是一个递归调用,最终会毁掉堆栈。

这是一个递归调用,最终会毁掉堆栈。

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


看看-您应该选择适合您的体系结构的技术。

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


看看-您应该选择适合您的体系结构的技术。

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


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

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


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

递归,它看起来像是在递归地调用自己。我很惊讶没有堆栈溢出异常。可能运行此服务的计算机上的服务属性被配置为在出现故障时重新启动服务。

递归,它看起来像是在递归地调用自己。我很惊讶没有堆栈溢出异常。运行此操作的计算机上的service属性可能配置为在出现故障时重新启动服务。

这看起来像堆栈溢出异常模式。埃兰是对的。使用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; } 公共静态void StartService() { //做些事情。。。 isRunning=true; ManageCycle(); } 公共静态void ManageCycle() { 同时(正在运行) { //做一些事情并包装异常处理 } } 公共静态void StopService() { isRunning=false; }
这看起来像堆栈溢出异常模式。埃兰是对的。使用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; } 公共静态void StartService() { //做些事情。。。 isRunning=true; ManageCycle(); } 公共静态void ManageCycle() { 同时(正在运行) { //做一些事情并包装异常处理 } } 公共静态void StopService() { isRunning=false; }
没关系。它将不断重复调用自己(这是一件坏事),这将导致堆栈溢出

“//做一些事情”是做什么的?也许有一个很好的理由让它自称,
b但是如果没有退出循环的方法(递归),应用程序将退出。

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

“//做一些事情”是做什么的?也许有一个很好的理由让它自称,
b但如果没有退出循环的方法(递归),应用程序将退出。

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

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

这是有意义的,因为它比迭代容易得多。但是,如果您只是一次又一次地重复某个操作,那么将其设为递归是完全没有必要的,并且会导致代码效率低下,最终导致堆栈溢出。

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

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

这是有意义的,因为它比迭代容易得多。但是,如果你只是一次又一次地重复一个动作,那么把它变成一个递归是完全没有必要的,这会导致代码效率低下,最终导致堆栈溢出。

OH-MY-good!!!为什么使用递归调用而不是while循环?!投票以“属于Dailywtf.com”的形式结束,哦,我的天哪!!!为什么使用递归调用而不是while循环?!投票关闭为“属于Dailywtf.com”……除非它有一个我们看不到的条件退出。@Michael:没关系,这不是一个递归调用技术的地方。……除非它有一个我们看不到的条件退出。@Michael:没关系,这不是一个递归调用技术的地方。//do some-stuff服务调用数据库来检索监视器集合,以检查网页、windows服务、,硬盘容量以及设备是否可ping。//do some stuff服务调用数据库检索监视器集合,以检查网页、windows服务、硬盘容量以及设备是否可ping。+1这是此问题的正确结论。这更像是一个“如何正确编码?”的问题,而不是“如何实现代码完美?”的问题。+1这是这个问题的正确结论。这更像是一个“如何正确编码?”的问题,而不是“如何实现代码的完美?”的问题。