Приложение WP7 аварийно завершает работу при частой активации / деактивации - PullRequest
3 голосов
/ 03 апреля 2012

Я заметил, что если в приложении WP7 я нажимаю клавишу «Пуск», затем быстро нажимаю клавишу «Назад», чтобы вернуться в приложение, и очень быстро повторяю эти шаги много раз, в результате происходит сбой приложения (оно неожиданно завершает работу и не может его восстановить). через клавишу возврата). Это происходит на устройстве (никогда не видели на эмуляторе), и требуется 10-15 шагов, прежде чем приложение будет закрыто. Я следую указаниям Microsoft по сохранению / восстановлению его состояния. Кроме того, все другие приложения, которые я пробовал таким образом, тоже аварийно завершают работу. Тем не менее, некоторые приложения гораздо сложнее убить, чем другие. Во время экспериментов с этим стресс-тестом я заметил, что

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

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

Ответы [ 2 ]

1 голос
/ 04 апреля 2012

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

1 голос
/ 03 апреля 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
    }

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

Старый:

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

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

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

...