[英]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张图像。
我对此解决方案非常感兴趣。 我稍后再讲。
但是,有几种可能是远程的。
我怀疑不是您发布的代码而是从TCP流中读取的代码正在增加堆栈。 在Image.FromStream
期间发生稻草折断骆驼的背的事实可能是不相关的。 我经常看到人们编写包含自调用代码的套接字处理代码(有时是间接的,例如A-> B-> A-> B)。 您应该检查该代码并将其发布在这里供我们查看。
我不确定它是否相关,但是Image.FromStream的MSDN文档指出, 在Image的生存 期内 , 必须保持流打开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.