Потратив всего полторы недели на то, чтобы заставить BackgroundAgent оставаться в пределах памяти, я бы посоветовал делать их по одному.
Вы теряете около половины своей памяти системным библиотекам иНапример, ваш первый веб-запрос займет еще почти 20%, но, похоже, он повторно использует эту память при последующих запросах.
Если вам нужно сохранить результаты в локальной базе данных, потребуется больше времени.Я обнаружил, что CompiledQuery
использует меньше памяти, что означает хранение одного экземпляра вашего контекста.
Между каждым вызовом я бы предложил сделать GC.Collect()
, я даже добавил бы короткий Thread.Sleep()
просто для того, чтобыуверен, что у процесса есть некоторое время, чтобы привести в порядок вещи.
Еще одна вещь, которую я делаю, это отслеживание того, сколько памяти я использую, и попытка изящно завершить работу, когда я доберусь до 97 или 98%.используйте отладчик для проверки пределов памяти, так как отладочная память намного выше, и ограничения не применяются.Однако для сравнительного тестирования между версиями вашего кода отладчик выдает очень похожие результаты при последующих запусках с тем же кодом.
Вы можете отслеживать использование памяти с помощью Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage
и Microsoft.Phone.Info.DeviceStatus.ApplicationMemoryUsageLimit
Я записываю журнал состояния в IsolatedStorage
, чтобы я мог видеть результаты запусков на телефоне, и использую ScheduledActionService.LaunchForTest()
, чтобы выключить его.Затем я использую уведомления ShellToast
, чтобы сообщить мне, когда задача запускается, а также когда она завершается, чтобы я мог запустить свое приложение, чтобы прочитать журнал состояния, не прерывая его.