Фоновая задача Windows Phone преждевременно останавливается


Я разрабатываю приложение WP8.1 SL, которое использует фоновые задачи (не агенты!).

Моя задача запускается Таймертриггером-один раз в 30 минут (что, по-моему, является минимальным интервалом для Windows Phone, верно?). Он делает много работы, и по какой - то причине иногда его прерывают-то есть он останавливается на середине. я знаю, что это в середине, потому что я регистрирую то, что происходит, и работа задачи в основном одинакова каждый раз. время.

Вчера я развернул приложение на своем устройстве, чтобы протестировать новый подход, и все работало отлично - фоновая задача делала все каждый раз, когда ее запускали - работала как заклинание. Сегодня мое устройство нуждалось в мягком сбросе, поэтому я сделал это (ничего не работало, это происходит время от времени, так как я обновился до WP8.1). С этого момента фоновая задача прерывается каждый раз, прямо в середине ее, как и в предыдущем подходе.

Любые идеи, которые могут причина этого? я думаю, что это может быть связано с мягкой перезагрузкой, потому что-100% успеха до нее, 0% после этого.

То, что я пробовал до сих пор:

  • Я регистрирую ошибки, у меня есть try-catch вокруг всего, я подписался на событие UnobservedException и на отмененное событие задачи, и я регистрирую количество приостановок - ничто из этих вещей не помогает. Кажется, нет никаких ошибок, он не приостановлен, и это не так. отмененный.

  • Я регистрирую текущее использование памяти время от времени, и это около 16-17 МБ. На моем устройстве ограничение должно быть 30 МБ, поэтому я не думаю, что это проблема.

  • Я вызываю RequestAccessAsync везде, где могу. Я подумал, что одного раза должно быть достаточно, но так как проблема с софт-перезагрузкой, я решил поместить его в 1-2 других местах, чтобы проверить, не вызывает ли это проблему. Ну, это не так, или, по крайней мере, это не исправило ситуацию.

В чем я не уверен о компании:

  • я понятия не имею, как проверить процессорное время, которое заняла моя задача. Я не могу найти хороший / надежный способ сделать это. Кроме того, я не могу найти никакой информации, которая объяснила бы, почему задача иногда останавливается в середине, а в других случаях - это будет работать нормально.

Есть идеи, почему моя фоновая задача иногда останавливается на середине? мне действительно трудно определить, как исправить / улучшить приложение и будет ли оно работать вообще.

Спасибо.

1 7

1 ответ:

Итак, я думаю, что нашел, в чем была моя проблема.

Во-первых, фоновой задаче просто требовалось много процессорного времени, больше, чем лимит, и именно поэтому она была убита в середине.

Причина, по которой он иногда работал, заключалась в том, что иногда устройство, на котором я тестировал, рассматривало приложение как находящееся в отладке (или с подключенным отладчиком). В этом случае ограничение на процессорное время снимается.

Итак, даже если я удалю приложение и перестрою его в Выпуск и повторное развертывание, а также запуск без подключенного отладчика, устройство не выполняло ограничений. Это происходит только в том случае, если я запустил приложение с отладчиком хотя бы один раз (или, возможно, в первый раз) после его развертывания. Перезапуск устройства (просто выключите питание, а затем включите) исправляет это.

Пока я тестировал, используя ту же сборку приложения, его фоновая задача выполнялась в течение 40 минут на одном устройстве и всего 3-4 секунды на другом. После того, как я перезапустил первый устройство, фоновая задача начала вести себя нормально (работает всего несколько секунд).

Итак, если вы хотите проверить фоновую задачу на наличие ограничений процессора:

  1. Вы должны тестировать на устройстве, а не на эмуляторе.
  2. удалите приложение, если оно установлено.
  3. перезагрузите устройство.
  4. развертывание сборки выпуска приложения.
  5. Запустите приложение, чтобы оно могло зарегистрировать фоновую задачу, а затем закройте ее.
  6. подождите, пока фоновую задачу, которая будет вызвана. (Вы можете добавить триггер, который может быть принудительным, например TimeZoneChanged или UserPresent, чтобы быстро протестировать его.)
P.S. Возможно, это не идеальный ответ, но это мои наблюдения, и они помогли мне решить мою проблему. Это, безусловно, лучший метод, который я нашел для тестирования процессорного времени, и он далек от совершенства. Так что, если у кого-то есть идеи получше, пожалуйста, поделитесь ими.