繁体   English   中英

通过再次调用相同方法,在循环期间发生C#StackOverFlow异常

[英]C# StackOverFlow Exception during loop by calling same method again

我有一个控制台应用程序,该应用程序进行API调用并将数据返回到控制台。

我正在使用线程来开始调用API和调用方法来获取最终调用自身的消息。 此示例引发StackOverFlowException。 但是,如果我使用简单的while循环,那么它可以完美地工作。

为什么在第一个代码示例中抛出StackOverFlowException,然后两个不同的方法实际上完成相同的工作?

var thread = new Thread(GetMessagesInternal);
thread.Start();

private static void GetMessagesInternal() { //THROWS STACKOVERFLOWEXCEPTION

    var messages = MyProgram.GetMessages();

    foreach (var message in messages) {
        Console.WriteLine($"{message.MessageText}");
    }

    GetMessagesInternal();
}

    private static void GetMessagesInternal() { //WORKS FINE

    while(true) {

       var messages = MyProgram.GetMessages();

       foreach (var message in messages) {
           Console.WriteLine($"{message.MessageText}");
       }
    }
}

方法要完成所有的操作-包括对自身的调用,才能完成。 该方法每次调用自身时,都会将当前状态压入堆栈,因此返回时可以恢复其状态。

经常这样做,将会使堆栈溢出。

要无限期地重复代码,可以改为在while(true)循环中进行。

PS。 IL有一个“尾部”方法 ,可以完成您希望代码执行的操作- 完成当前方法并执行另一个方法-但C#语言中未包含该方法。

这个问题。

    private static void GetMessagesInternal() //WORKS FINE
{

    while(true)
    {
       var messages = MyProgram.GetMessages();

       foreach (var message in messages)
       {
           Console.WriteLine($"{message.MessageText}");
        }
    }

这将进入无限循环.GetMessages()方法将被无限调用,您需要在特定条件下打破此循环。

两个片段之间的区别是嵌套。 如果您打自己的电话,则在其他电话结束之前您不会“退出”。

可视化:

-->GetMessagesInternal
    --> GetMessagesInternal
        --> GetMessagesInternal
            --> GetMessagesInternal
                --> etc

这将淹没堆栈,每个调用都保留在堆栈上

另一个:

-->GetMessagesInternal
-->GetMessagesInternal
-->GetMessagesInternal
-->GetMessagesInternal
-->etc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM