Итак, это приложение .NET CF 3.5, работающее на CE7. Проблема видна и в CE5.
Мы используем HttpWebRequests для запроса сервера. В онлайне вроде все хорошо.
Когда сервер недоступен, мы наблюдаем то, что выглядит как утечка ресурсов.
Используя удаленный монитор производительности CF, мы можем видеть, как накапливаются (в конце концов) десятки тысяч слабых ссылок, которые никогда не исчезают. Занимает кучу памяти. Куча растет линейно. Смотрите скриншоты.
Все они помечены как корни и финализаторы. У меня такое чувство, что финализатор для веб-запроса как-то не работает должным образом, но не совсем уверен, как все это интерпретировать.
Когда запрос завершен (или возникает исключение), мы удаляем IDisposables в запросе (поток запроса и поток ответа).
Не могли бы вы объяснить, что здесь происходит, пожалуйста? Почему все эти слабые ссылки накапливаются, а не собираются мусором? Любое понимание ценится.
Спасибо.
РЕДАКТИРОВАТЬ:
Вероятно, также стоит упомянуть, что в отладчике мы иногда видим это исключение 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()