所以这是一个在CE7上运行的.NET CF 3.5应用程序。在CE5中也可以看到这个问题。
我们使用HttpWebRequests来查询服务器。在线时,一切似乎都很好。
当服务器不可用时,我们会观察到资源泄漏。
使用CF远程性能监视器,我们可以看到成千上万的弱引用堆积(最终),永远不会消失。占用大量内存。堆线性增长。见截图。
他们都被标记为根和终结者。我觉得webrequest的终结器不能以某种方式正常工作,但不太确定如何解释这一切。
当请求完成(或发生异常)时,我们会在请求中处理IDisposable(请求流和响应流)。
你能解释一下这里发生了什么吗?为什么所有这些弱点都会累积而不会被垃圾收集?任何洞察力都赞赏。
感谢。
编辑:
它可能也值得一提,在调试器中,我们偶尔会看到这个未被捕获的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()