2013-02-11 1 views
4

В моем приложении на WP8 я работаю со всеми датчиками. Акселерометр, компас (из Windows.Devices.Sensors и из Microsoft.Devices.Sensors тоже) и инклинометр. Все работает нормально, пока я не нажму кнопку Windows и после этого Назад кнопка. Я получаю полный черный экран с «Возобновление ...» сообщение и ничего не происходит. Как только у меня возникло исключение (из 5 фейлора только один раз):WP8 приложение возобновляет работу с датчиками

{System.Runtime.InteropServices.SEHException: External component has thrown an exception. 
    at Microsoft.Devices.Sensors.SensorBase`1.PauseSensor() 
    at Microsoft.Devices.Sensors.SensorBase`1.<>c__DisplayClass7.<.ctor>b__4(Object sender, NotificationCallbackEventArgs args) 
    at Microsoft.Devices.Sensors.SensorCallback.MS.Internal.Interop.INotificationCallback.Pausing(XPauseType pauseType) 
    at MS.Internal.Interop.NotificationService.NotificationPausing(XPauseType pauseType) 
    at MS.Internal.FrameworkCallbacks.NotificationPausing(UInt32 pauseType)} 

Был ли кто-то знаком с этим исключением?

Или существует лучшая практика, работающая правильно с датчиками во время жизненного цикла приложения wp8?

Thanks

ответ

3

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

Я работал с датчиками через классы обслуживания: эти классы обновляют мои виртуальные машины, а в виртуальных машинах я использую свой DispatcherHelper для обновления их в пользовательском интерфейсе. Я знал, что если я хочу обновить связанные свойства интерфейса в событиях с измененными значениями датчиков, мне нужно вызвать это обновление в обработчике событий с помощью диспетчера-диспетчера, но я не знал, как они себя ведут, если они взаимодействуют с виртуальными машинами, а не с представлениями. Когда я начал приложение, у меня не возникло проблем с обновлением пользовательского интерфейса, если бы датчики имели новое значение. Моя единственная проблема заключалась в том, что если бы я захотел деактивировать (нажал кнопку окна) и активировал (нажал кнопку назад) мое приложение, у меня не было исключения, я не потерял сессию отладки, а получил только черную страницу с «возобновлением» ... "и работает индикатор прогресса, и ничего не произошло.

То, что я пропустил, было исключение crossthread/accessing. Если я делаю это с данными, привязанными к пользовательскому интерфейсу, он генерирует исключение, но в этом случае это не так.

Еще одна вещь: акселерометр (у меня была версия, работающая только с акселерометром) работает с эмулятором, но на устройстве это не так. Я думаю, что эмулятор пытается имитировать ускоритель, возвращая значения, но не в правильном направлении (без проблемы с потоками).

Решение

Если я обновлю в пределах EventHandler на потоке пользовательского интерфейса (с моей DispatcherHelper) все работает отлично. Это хороший урок, который всегда следует учитывать при взаимодействии с датчиками и другими слоями/потоками (VM, V).

+0

Не могли бы вы объяснить, как передать диспетчеру VM в ваше решение? Спасибо. –

+0

Извините за ответ так поздно. У меня есть собственный класс помощников-диспетчеров. Одиночный класс с методом регистрации Dispatcher, Register (Dispatcher d) и другого метода void Invoke (Действие a), который проверяет диспетчера, а если не является нулевым вызовом диспетчера.BeginInvoke (a), и я вызываю метод register в моем классе Bootstrapper. UiDispatcher.Instance.Register (RootFrame.Dispatcher), или вы вызываете его из MainView тоже или из другого места, где у вас есть диспетчер rootframe. Если не ясно, я отправлю его другим ответом. –

1

Звучит как проблема жизненного цикла.

Вы пытались вызвать SensorBase.Stop() на датчиках из Microsoft.Devices.Sensors на App.Deactivated событие и возобновить использование SensorBase.Start() в App.Activated событие? В зависимости от того, сколько страниц в вашем приложении нуждается в доступе к датчику, вы даже можете переопределить методы OnNavigatedTo/OnNavigatedFrom и использовать их.

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

+1

Я вызываю свой компас (из Microsoft.Devices.Sensors) Stop(), но после некоторой отладки, которую я нашел, он никогда не заканчивается. Я мэн, что у меня после компаса.Stop() никогда не вызывается, и если я разрешаю отладчику работать после моего перехода из моего приложения, он занимает 1-2 минуты, но я получаю System.Runtime.InteropServices.SEHException (произошел в Unknown Module, но не был обработан в коде пользователя) , Похоже, что Stop не заканчивается до тех пор, пока ОС не захочет освободить ресурсы приложений (-> terminated-phase) –

+0

Я тоже раньше вызывал Stop(), но у меня были проблемы с обработкой lifecycle в Caliburn.Micro и OnDeactivated в Bootstrapper никогда не вызывались , Но у вас есть право, что всегда необходимо вызвать Stop/Start on Sensores из SensorBase . –

 Смежные вопросы

  • Нет связанных вопросов^_^