Приложение WP7 вылетает при частой активации/деактивации

I noticed that, if in WP7 application I press Start key then quickly Back key to return to the app, and very quickly repeat these steps many times, the application ends up being crashed (it exits unexpectedly and no way to recover it via Back key). This happens on device (never seen on emulator), and it takes 10-15 steps before the application gets shut down. I follow Microsoft guidelines about saving / restoring its state. Furthermore, all other apps I've tried in such way crash too. However, some apps are much harder to kill in this way than the others. During experiments with this stress test, I noticed that

  • Игры XNA, как правило, менее устойчивы, чем чистые приложения Silverlight.
  • Чем больше данных приложение сохраняет/восстанавливает, тем менее оно устойчиво
Unfortunately, my XNA game has to save a lot of data during deactivation, and it's pretty easy to get it crashed.

Кто-нибудь знает, это известная проблема или что-то еще? Буду признателен за любые советы, как сделать игру более стабильной, если полностью устранить проблему не представляется возможным.


person mbakulin    schedule 03.04.2012    source источник
comment
Предоставляются ли вам какие-либо подробности сбоя, такие как трассировка стека или исключение?   -  person Adam Houldsworth    schedule 03.04.2012
comment
Если вы не можете воспроизвести проблему с подключенным отладчиком, найдите обработчик необработанных исключений в app.xaml.cs, запишите сведения об исключении в изолированное хранилище, а затем отобразите их при следующем запуске.   -  person Kevin Gosse    schedule 03.04.2012
comment
Я видел это раньше. Он падает во время десериализации (если сериализация еще не завершена), и пользовательский код не выполняется, чтобы предотвратить это с помощью try/catch или чего-то еще. Будет здорово, если кто-то знает решение   -  person Ku6opr    schedule 03.04.2012
comment
@Ku6opr Ku6opr Помимо того, что вы не экономите так много на надгробии ... это звучит как проблема Microsoft.   -  person Adam Houldsworth    schedule 03.04.2012
comment
@KooKiz Спасибо за ваш ответ. На самом деле я не могу воспроизвести проблему с подключенным отладчиком. Я сделал то же самое, что вы сказали, но, к сожалению, игра вылетает без каких-либо исключений. Я также добавил журналирование для активированных/деактивированных/запущенных/закрытых функций обратного вызова, но в журналах нет ничего особенного. Последняя запись была в методе Application_Deactivated, который был вызван и правильно завершен.   -  person mbakulin    schedule 04.04.2012
comment
@AdamHouldsworth Нет, как показали мои эксперименты с изолированным хранилищем, необработанных исключений не было.   -  person mbakulin    schedule 04.04.2012


Ответы (2)


Я нашел обходной путь, как сделать приложение немного более стабильным. Собственно, мы не хотим каждый раз при деактивации сохранять игровые данные в изолированное хранилище. Это необходимо только при изменении состояния игры. Поскольку моя игра автоматически приостанавливается после активации, ее состояние не изменилось, и мне не нужно снова сохранять ее данные, пока пользователь не возобновит игру. Таким образом, сохранение данных в изолированном хранилище происходит только при первой деактивации. Такой подход немного помог, но не слишком. 20 итераций клавиши «Пуск» / «Назад» все еще заставляют его опускаться.

person mbakulin    schedule 04.04.2012

По идее, что проблема может заключаться в процессе де/-сериализации, вы можете сделать это:

    private IsolatedStorageSettings isosettings = IsolatedStorageSettings.ApplicationSettings;
    void Application_deactivated()
    {
        isosettings.Add("serialization_finished", false);//just add once, 
                    //after that use isosettings["serialization_finished"]
        //DO: save here your code into isostorage
        isosettings["serialization_finished"] = true;
    }
    void Application_activated()
    {
        while (!isosettings["serialization_finished"])
            Thread.Sleep(500);
        //DO: read you data from isostorage
    }

Таким образом, вы практически создаете переключатель включения / выключения, чтобы проверить, завершен ли процесс сериализации.

Старый:

У Tombstoneing есть лимит времени, в течение которого он должен быть закончен (10 секунд). Я тут предполагаю, что вы ему так много даете надгробия, что в какой-то момент один экземпляр приложения не может закончить надгробие вовремя. Но это всего лишь предположение, исходя из того, что чем больше сэкономишь, тем быстрее рухнешь.

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

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

person kadir    schedule 03.04.2012
comment
Спасибо за ваш ответ. Я измерил время деактивации и заметил, что оно всегда держится около 1 секунды, так что вряд ли проблема накопления. Но как-то уменьшить это время (например, не сохраняя часть игровых данных) делает игру более стабильной. Не слишком много, но тем не менее. - person mbakulin; 04.04.2012