紧凑框架 - 离线时HttpWebRequest资源泄漏

时间:2014-06-13 14:18:23

标签: c# memory-leaks httpwebrequest compact-framework finalizer

所以这是一个在CE7上运行的.NET CF 3.5应用程序。在CE5中也可以看到这个问题。

我们使用HttpWebRequests来查询服务器。在线时,一切似乎都很好。

当服务器不可用时,我们会观察到资源泄漏。

使用CF远程性能监视器,我们可以看到成千上万的弱引用堆积(最终),永远不会消失。占用大量内存。堆线性增长。见截图。

他们都被标记为根和终结者。我觉得webrequest的终结器不能以某种方式正常工作,但不太确定如何解释这一切。

当请求完成(或发生异常)时,我们会在请求中处理IDisposable(请求流和响应流)。

你能解释一下这里发生了什么吗?为什么所有这些弱点都会累积而不会被垃圾收集?任何洞察力都赞赏。

感谢。

RMP RMP RMP RMP

编辑:

它可能也值得一提,在调试器中,我们偶尔会看到这个未被捕获的ObjectDisposedException异常,并关闭应用程序(因为它在Threadpool线程上)。只是偶尔。可能/可能与上述泄漏无关。我们已经尝试过使用/处理/不处理/关闭我们可以使用的流的每个变体,以及对此的每一点建议都无济于事。

   at System.Threading.Timer.throwIfDisposed()
   at System.Threading.Timer.Change(UInt32 dueTime, UInt32 period)
   at System.Threading.Timer.Change(Int32 dueTime, Int32 period)
   at System.Net.HttpWebRequest.startReadWriteTimer()
   at System.Net.HttpWebRequest.ConnectionClient.Read(Byte[] data, Int32 offset, Int32 length)
   at System.Net.HttpReadStream.NetworkRead(Byte[] data, Int32 offset, Int32 length)
   at System.Net.ContentLengthReadStream.doRead(Byte[] data, Int32 offset, Int32 length)
   at System.Net.HttpReadStream.ReadToDrain(Byte[] buffer, Int32 offset, Int32 length)
   at System.Net.HttpReadStream.doClose()
   at System.Net.ContentLengthReadStream.doClose()
   at System.Net.HttpReadStream.Finalize()

0 个答案:

没有答案