Подключение событий и что делать с приложением потом - PullRequest
1 голос
/ 15 июля 2009

У меня есть базовое приложение для перехвата SMS на мобильном телефоне с Windows, в настоящее время это консольное приложение, которое подключает событие MessageReceived класса MessageInterceptor.

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

Я пробовал несколько других подходов;

  • Проект ManagedServicesWM от Codeplex - это было слишком сложно для того, что мне было нужно, и оказалось бесконечным циклом с Thead.Sleep (200), так же как и заряд батареи для моего приложения.
  • Doing Console.ReadLine (); - но кажется, что стандартный ввод нулевой для приложений консоли WM, так что это ничего не сделало.
  • Использование приложения форм - это только сделало мое основное приложение более сложным и многопоточным без усиления, и дало мне бесполезную форму.

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

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

Ответы [ 3 ]

1 голос
/ 09 сентября 2009

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

Я бы ожидал, что общая процедура будет выглядеть следующим образом:

static class Program
{
    static MessageInterceptor interceptor;

    static void Main()
    {
        Thread listener = new Thread(new ThreadStart(
            delegate
            {
                interceptor = new MessageInterceptor(InterceptionAction.Notify, false);
                interceptor.MessageReceived += new MessageInterceptorEventHandler(OnMessageReceived);
            }));
        listener.IsBackground = true;
        listener.Start();

        EventWaitHandle eh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyShutdownEventName");

        while (!eh.WaitOne(1000, true))
        {
            // do nothing
        }

        interceptor.Dispose();
    }

    static void OnMessageReceived(object sender, MessageInterceptorEventArgs e)
    {
        DoSomething();
    }
}

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

Если вы действительно обеспокоены, вы можете изменить тайм-аут на Timeout.Infinite, но любое использование Infinite сразу же получит от меня отрицательные моменты в обзоре кода. Бесконечное ожидание очень, очень, очень, очень, очень редко применимо вне драйвера (и даже тогда я редко использую их), потому что бесконечное ожидание говорит планировщику, что вы в порядке, никогда не выключаясь.

1 голос
/ 06 января 2010

После нескольких месяцев использования я не видел, чтобы мое консольное приложение заканчивалось диспетчером памяти Windows, и, кажется, все работает нормально, кроме "занятого круга" при запуске приложения после сброса.

Моя батарея также кажется незатронутой, что лучше, чем некоторые опции с бесконечным циклом, ManagedServicesWM и OpenNetCF, которые значительно сокращают срок службы батареи.

0 голосов
/ 09 сентября 2009

вместо этого вы можете попробовать использовать OPENNETCF - http://www.opennetcf.com/library/sdf/html/8ef93ad6-d839-2c70-695d-04e2679c0c27.htm

...