打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【有效解决】C# 报错System.StackOverflowException

报错原因: 因为使用了递归,当调用的深度过深,则会引发内存溢出从而触发.net的保护机制,导致程序中断

经过两天的奋战,终于完美解决了这个问题,接下来Share一下我的解决过程,没有耐心看的可以直接滑到底部,查看最终的解决方案。

详细报错信息截图:


----------解决过程分享----------

在网上冲浪找了很久,总结了一下网友们提供的两个解决方案,为:

1.使用Thread.Sleep(1000)
我使用后的结论: 除了会降低递归的速度以外,并没有其他帮助,未能解决问题。递归到一定的量,占用足够的内存时照样会提示报错System.StackOverflowException。

2.改变递归的写法
原先的递归写法:

public void MethodA()
{
    if () 
    {
    }
    else
    {
        this.MethodA();
    }
}

改为:

public void MethodA()
{
    if () 
    {
    }
    else
    {
        this.MethodB();
    }
}

public void MethodB()
{
    if ()
    {
    }
    else
    {
        MethodA();
    }
}

他对这两种的写法解释为:比较两种写法,第一种写法不断的递归,函数嵌套层数过多最后导致栈内存溢出,而第二种写法将循环的部分放到了另外一个函数,进入MethodB的时候MethodA已经结束了,其占用的栈内存可以得到释放,所以没有过多的函数嵌套。
我使用后的结论: 除了实现递归的写法变得复杂以外,并没有其他帮助,未能解决问题。递归到一定的量,占用足够的内存时照样会提示报错System.StackOverflowException。

----------最终的解决方案----------
在你调用递归的方法那里,加入两行代码。

var t = new Thread(delegate () { AutoHook(); }, 1073741824);
t.Start();

AutoHook() --> 递归调用的方法
1073741824 --> 最大堆栈大小

运行后,测试,完美解决!!!

加入这两行代码的作用: 实例化开启新的线程并委托递归调用的方法,这样就能和之前的进程分离,释放之前线程占用的内存。指定新的线程最大堆栈大小,防止递归调用的方法会内存溢出。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C#中接口的理解
NET中的三种接口实现方式
再论组合与继承
asp.net报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决办法
什么叫有状态对象和无状态对象?--bbs
Objective C实现多继承!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服