Compact Framework - System.Threading.Timer останавливается, когда пользователь выключает экран - PullRequest
5 голосов
/ 12 ноября 2008

У меня есть приложение, которое должно «опросить» веб-сервис, чтобы увидеть, есть ли у пользователя новые сообщения в ожидании. У меня нет контроля над веб-сервисом, поэтому я не могу переключиться на механизм push, я застреваю, делая запрос каждые X секунд, чтобы посмотреть, что доступно.

Я использую System.Threading.Timer, чтобы сделать запрос время от времени, но сталкиваюсь с несколькими проблемами. Самым большим является то, что он перестает работать, когда телефон переходит в режим ожидания (экран выключен, но все еще может принимать звонки и уведомления по электронной почте / TXT).

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

Ответы [ 5 ]

4 голосов
/ 15 ноября 2008

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

1 голос
/ 12 ноября 2008

Да. Подобно тому, как ответил MusiGenesis, вы не сможете многого сделать, не поддерживая устройство в рабочем состоянии. Подобно тому, как некоторые телефоны будут уведомлять о том, что «Игра / Приложение запущено» и, следовательно, ваша батарея шлепается.

Как насчет написания интерфейса с вашего телефона для использования текстовых сообщений (который все еще работает) и заставить его отправлять текстовые сообщения в веб-службу? Это будет возможно? Я предполагаю, что такой метод также может перестать работать, но я думаю, что это мысль?

1 голос
/ 12 ноября 2008

Я не уверен насчет компактного фреймворка, но в Win32 есть WaitableTimer, который может разбудить компьютер из режима ожидания. Это требует некоторых собственных вызовов, поскольку в .Net нет оболочки.

1 голос
/ 12 ноября 2008

Ты ничего не можешь сделать, AFAIK. Режим ожидания предназначен для приостановки процессора для экономии энергии, и ваш код не сможет выполняться, если процессор не работает. Ваше приложение может сделать что-то, чтобы предотвратить переход устройства в режим ожидания, но на самом деле это вообще не рекомендуется.

0 голосов
/ 12 ноября 2008

Хотя вы не можете изменить веб-сервис, вы можете добавить второй «теневой» веб-сервис между вашими клиентами и исходным веб-сервисом. Теневой веб-сервис может опрашивать исходный веб-сервис и затем «проталкивать» все, что он обнаружит, в КПК.

Я думаю, что у вас все еще может быть такая же проблема. Я никогда не делал «push» от веб-сервиса, но я думаю, что он в основном реализован, когда клиент делает первоначальный вызов метода веб-сервиса, который передает делегат методу в клиенте, который веб-сервис затем вешает. Когда веб-сервису нужно что-то выдвинуть, он вызывает этот делегат. Если клиент тем временем перешел в режим ожидания, попытка вызвать делегата с сервера не удастся.

...