Фоновая задача Windows Phone преждевременно останавливается
Я разрабатываю приложение WP8.1 SL, которое использует фоновые задачи (не агенты!).
Моя задача запускается Таймертриггером-один раз в 30 минут (что, по-моему, является минимальным интервалом для Windows Phone, верно?). Он делает много работы, и по какой - то причине иногда его прерывают-то есть он останавливается на середине. я знаю, что это в середине, потому что я регистрирую то, что происходит, и работа задачи в основном одинакова каждый раз. время.
Вчера я развернул приложение на своем устройстве, чтобы протестировать новый подход, и все работало отлично - фоновая задача делала все каждый раз, когда ее запускали - работала как заклинание. Сегодня мое устройство нуждалось в мягком сбросе, поэтому я сделал это (ничего не работало, это происходит время от времени, так как я обновился до WP8.1). С этого момента фоновая задача прерывается каждый раз, прямо в середине ее, как и в предыдущем подходе.Любые идеи, которые могут причина этого? я думаю, что это может быть связано с мягкой перезагрузкой, потому что-100% успеха до нее, 0% после этого.
То, что я пробовал до сих пор:
-
Я регистрирую ошибки, у меня есть try-catch вокруг всего, я подписался на событие UnobservedException и на отмененное событие задачи, и я регистрирую количество приостановок - ничто из этих вещей не помогает. Кажется, нет никаких ошибок, он не приостановлен, и это не так. отмененный.
-
Я регистрирую текущее использование памяти время от времени, и это около 16-17 МБ. На моем устройстве ограничение должно быть 30 МБ, поэтому я не думаю, что это проблема.
-
Я вызываю RequestAccessAsync везде, где могу. Я подумал, что одного раза должно быть достаточно, но так как проблема с софт-перезагрузкой, я решил поместить его в 1-2 других местах, чтобы проверить, не вызывает ли это проблему. Ну, это не так, или, по крайней мере, это не исправило ситуацию.
В чем я не уверен о компании:
- я понятия не имею, как проверить процессорное время, которое заняла моя задача. Я не могу найти хороший / надежный способ сделать это. Кроме того, я не могу найти никакой информации, которая объяснила бы, почему задача иногда останавливается в середине, а в других случаях - это будет работать нормально.
Есть идеи, почему моя фоновая задача иногда останавливается на середине? мне действительно трудно определить, как исправить / улучшить приложение и будет ли оно работать вообще.
Спасибо.
1 ответ:
Итак, я думаю, что нашел, в чем была моя проблема.
Во-первых, фоновой задаче просто требовалось много процессорного времени, больше, чем лимит, и именно поэтому она была убита в середине.Причина, по которой он иногда работал, заключалась в том, что иногда устройство, на котором я тестировал, рассматривало приложение как находящееся в отладке (или с подключенным отладчиком). В этом случае ограничение на процессорное время снимается.
Итак, даже если я удалю приложение и перестрою его в Выпуск и повторное развертывание, а также запуск без подключенного отладчика, устройство не выполняло ограничений. Это происходит только в том случае, если я запустил приложение с отладчиком хотя бы один раз (или, возможно, в первый раз) после его развертывания. Перезапуск устройства (просто выключите питание, а затем включите) исправляет это.
Пока я тестировал, используя ту же сборку приложения, его фоновая задача выполнялась в течение 40 минут на одном устройстве и всего 3-4 секунды на другом. После того, как я перезапустил первый устройство, фоновая задача начала вести себя нормально (работает всего несколько секунд).
Итак, если вы хотите проверить фоновую задачу на наличие ограничений процессора:
P.S. Возможно, это не идеальный ответ, но это мои наблюдения, и они помогли мне решить мою проблему. Это, безусловно, лучший метод, который я нашел для тестирования процессорного времени, и он далек от совершенства. Так что, если у кого-то есть идеи получше, пожалуйста, поделитесь ими.
- Вы должны тестировать на устройстве, а не на эмуляторе.
- удалите приложение, если оно установлено.
- перезагрузите устройство.
- развертывание сборки выпуска приложения.
Запустите приложение, чтобы оно могло зарегистрировать фоновую задачу, а затем закройте ее.- подождите, пока фоновую задачу, которая будет вызвана. (Вы можете добавить триггер, который может быть принудительным, например TimeZoneChanged или UserPresent, чтобы быстро протестировать его.)