Что вызывает сбой моего приложения WP7? - PullRequest
2 голосов
/ 21 ноября 2010

У меня было несколько необъяснимых сбоев, происходящих как на эмуляторе, так и на самом телефоне. В основном, когда мое приложение падает, у меня не появляется никакого диалогового окна, и телефон возвращается на главный экран.

У меня есть следующий код для отображения MessageBox, но это как-то обходит ...

// Code to execute if a navigation fails
private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
    MessageBox.Show(e.Exception.ToString());
}

// Code to execute on Unhandled Exceptions
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
    MessageBox.Show(e.ExceptionObject.ToString());
}

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

Ответы [ 4 ]

5 голосов
/ 21 ноября 2010

Следите за использованием памяти.OutOfMemoryException приводит к сбою приложения без вызова обработчика Application_UnhandledException.Вы можете проверить текущее использование памяти с помощью некоторых встроенных методов.Я писал об этом некоторое время назад http://kodierer.blogspot.com/2010/09/windows-phone-memory-constraints.html

Вот основной код, который вы должны добавить:

var timer = new DispatcherTimer {Interval = TimeSpan.FromSeconds(2)};
timer.Tick += (s, e) =>
{
   var memuse = (long)DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage");
   var maxmem = (long)DeviceExtendedProperties.GetValue("DeviceTotalMemory");
   memuse /= 1024 * 1024;
   maxmem /= 1024 * 1024;
   MyTextBlock.Text = String.Format("Mem usage: {0} / {1} MB", memuse, maxmem);
};
timer.Start();
5 голосов
/ 21 ноября 2010

Несколько вещей, которые произошли со мной:

  • Если вы делаете что-то в других потоках, то исключения IIRC в этих потоках приведут к тому, что приложение просто закроется. Возможно, вы захотите обернуть новый код потока в обработчик исключений, который распространяет исключение в поток пользовательского интерфейса
  • Если ваше приложение выдает исключение до загрузки первой страницы, это может привести к тому, что приложение просто умрет без вызова соответствующего обработчика
  • Если у вас есть StackOverflowException, он не может быть пойман и просто сделает приложение бомбой

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

1 голос
/ 07 декабря 2011

Мое приложение рухнуло точно так же.

Я отследил его до появления исключения OutOfMemoryException внутри тик-обработчика DispatcherTimer, хотя проблема, вероятно, возникает и в других местах.это не тот случай, когда OutOfMemoryException всегда закрывает вашу программу.Это не.Я пробовал это в различных других обработчиках, и это было правильно поймано.

Я отправил запись в блоге о потерянных исключениях здесь

0 голосов
/ 22 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...