【发布时间】:2011-01-08 03:00:27
【问题描述】:
我现在整天都被这个问题所困扰,阅读了数千个谷歌结果,但似乎没有任何反映我的问题甚至接近它......我希望你们中的任何人都朝着正确的方向前进我。
我写了一个客户端-服务器-应用程序(更像是 2 个应用程序) - 客户端收集有关他的系统的数据以及屏幕截图,将所有这些序列化为 XML 流(图片为 byte[]-array ]) 并定期将其发送到服务器。 服务器接收流(通过 tcp),将 xml 反序列化为信息对象,并在 windows 窗体上显示信息。 此过程以 3 秒的提交间隔稳定运行约 20-25 分钟。在观察内存使用情况时,没有什么重要的可看的,也有点稳定。但是在这 20-25 分钟之后,服务器会在反序列化 tcp-stream 时抛出 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;
}
}
我希望不需要更多代码,否则会变得非常复杂...
请帮忙,我一点头绪都没有了
谢谢 克里斯
【问题讨论】:
-
不知道你在 _screen = Image.FromStream(ms) 中做了什么,也许你不小心设置了 ImageBase?
-
你真的应该把每个 MemoryStream 的使用放到一个 using() 块中,这样更容易看到正确处理的内容!
-
尝试将堆栈跟踪的日志记录到您的 AppDomain.UnhandledException 事件中......当您的 try-catch 没有时应该触发该事件。我们真的需要一个堆栈跟踪来追踪这个问题msdn.microsoft.com/en-us/library/…
-
不确定这是否能解决问题,但 ms.Dispose() 命令应该在 finally 子句中。
-
关于堆栈溢出的一个堆栈溢出问题是递归,你怎么能说没有呢?
标签: c# .net image memorystream stack-overflow