Sub Main()中的无限循环通过调用自身?

时间:2013-12-17 11:48:26

标签: .net vb.net console-application

这可能是一个非常愚蠢的问题,如果这是一个坏/好/禁止的方法,我正在寻找你的输入。

让我们说我有一个控制台应用程序,我想永远运行。

我刚试过这个

Module Module1

    Sub Main()
        Try
            Console.WriteLine(Now())
            System.Threading.Thread.Sleep(1000)
        Catch ex As Exception

        End Try
    ' Call the routine again
    Main()
    End Sub

End Module

这只是在睡眠1秒后打印当前时间并继续运行。

我只是想知道这是循环例程的好或坏方法吗?

3 个答案:

答案 0 :(得分:2)

这取决于你运行它的机器。如果它引导64位操作系统并且您的项目的目标CPU设置为“AnyCPU”,那么它将正常工作,64位抖动将使用称为“尾递归优化”的优化来将递归调用转换为跳转。如果没有,那么你的程序最终会以这个网站的名字轰炸。

当你能做到这一点时,没有必要冒这个风险:

Sub Main()
    Do
       '' Rest of your code
       ''...
    Loop
End Sub

答案 1 :(得分:1)

这是无限递归,最终会导致堆栈溢出。

每次调用函数时,都会将内容推送到堆栈中。当每个函数完成时,堆栈通过弹出那些东西来“展开”。你永远不会完成任何功能,而且堆栈的大小有限。最终你会超过那个尺寸,你会崩溃。

取消睡眠,看看会发生什么。

答案 2 :(得分:1)

在控制台应用程序中运行无限循环绝对是个坏主意。正如Roger Rowland所说,它会导致堆栈溢出。

如果您希望始终在后台运行某些内容,则可以使用Windows服务而不是控制台应用程序。

如果您需要使用控制台应用程序,因为Windows服务并非在所有平台上都可用(即Compact Framework),您可以try this