繁体   English   中英

StackOverFlowException-但以前没有递归/无限循环

[英]StackOverFlowException - but oviously NO recursion/endless loop

我现在整天都被这个问题所困扰,阅读了成千上万的google结果,但是似乎没有任何东西可以反映出我的问题,甚至无法解决它……我希望你们中的任何一个都能为我提供正确的方向。

我写了一个客户端服务器应用程序(更像2个应用程序)-客户端收集有关其系统的数据以及屏幕截图,将所有这些序列化为XML流(图片为byte []-array]),然后定期将其发送到服务器。 服务器接收流(通过tcp),将xml反序列化为一个信息对象,并在Windows窗体上显示信息。 此过程稳定运行约20-25分钟,提交间隔为3秒。 观察内存使用情况时,没有什么可看的,也很稳定。 但是在这20到25分钟之后,服务器在对tcp流进行反序列化时会抛出StackOverflowException,特别是在从byte []-array设置Image属性时。

我彻底搜索了递归循环或无穷循环,并且考虑到它在成千上万次成功间隔之后发生,这一点我很难想象。

    public byte[] ImageBase
    {
        get
        {
            MemoryStream ms = new MemoryStream();
            _screen.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            return ms.GetBuffer();
        }
        set
        {
            if (_screen != null) _screen.Dispose(); //preventing well-known image memory leak
            MemoryStream ms = new MemoryStream(value);
            try
            {
                _screen = Image.FromStream(ms); //<< EXCEPTION THROWING HERE
            }
            catch (StackOverflowException ex) //thx to new CLR management this wont work anymore -.-
            {
                Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
            }
            ms.Dispose();
            ms = null;
        }
    }

我希望不需要更多代码,否则可能会变得非常复杂...

请帮助,我一点都不知道了

克里斯

您可能需要阅读此内容。 从流中加载图像而不保持流打开

似乎有可能流被保留在堆栈或最终吹散堆栈的某些其他对象上。

我的建议是只保留住byte[]并等到最后可能的时刻对其进行解码和绘制。 然后立即处理图像。 您的get / set刚好会设置/获取byte[] 然后,您将实现一个自定义绘制例程,该例程将解码当前的byte[]并对其进行绘制,以确保不占用任何不必要的资源。

更新资料

如果有办法可以为我们提供完整的堆栈跟踪信息,我们也许可以提供进一步的帮助。 我开始认为这不是我描述的问题。 我创建了一个示例程序,就像您在设置员中所做的一样,它创建了10,000张图像,这没有问题。 如果每3秒发送一次图像,则每分钟30张图像乘以20分钟即600张图像。

我对此解决方案非常感兴趣。 我稍后再讲。

但是,有几种可能是远程的。

  • Image.FromStream试图处理无效/损坏的byte [],并且该方法以某种方式使用递归来解码位图。 不大可能。
  • 不会在您认为的地方抛出异常。 如果可能的话,完整的堆栈跟踪将非常有帮助。 如您所说,您无法捕获StackOverflowException。 我相信,如果您通过调试器运行它,则对此有规定。

我怀疑不是您发布的代码而是从TCP流中读取的代码正在增加堆栈。 Image.FromStream期间发生稻草折断骆驼的背的事实可能是不相关的。 我经常看到人们编写包含自调用代码的套接字处理代码(有时是间接的,例如A-> B-> A-> B)。 您应该检查该代码并将其发布在这里供我们查看。

我不确定它是否相关,但是Image.FromStream的MSDN文档指出, 在Image的生存 期内必须保持流打开。

暂无
暂无

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

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