Непрерывное/неблокирующее приложение Windows Mobile

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

Вот мой код:

class Program { static public ManualResetEvent StopMain;

    static void Main(string[] args)
    {
        // Hide the cursor.
        Cursor.Current = Cursors.Default;

        StopMain = new ManualResetEvent(false);

        RunHook runHook = new RunHook();

        // wait until signalled by Program.StopMain.Set();
        StopMain.WaitOne();             

    }
}

class RunHook
{
    private HookKeys hook;
    public RunHook()
    {
        hook = new HookKeys();
        hook.HookEvent += EventForHook;
    }

    private void EventForHook(HookEventArgs e, KeyBoardInfo keyBoardInfo, 
      ref Boolean handled)
    {
        if ((keyBoardInfo.scanCode == 4) && (keyBoardInfo.vkCode == 114))
            handled = true;
    }
}

Любые идеи о том, как заставить это работать в фоновом режиме, но никогда не прекращать работу?


person Vaccano    schedule 07.08.2009    source источник


Ответы (1)


Поведение, которое вы видите, ожидаемо. У вас есть один поток, и он находится в состоянии ожидания. Чтобы получить какую-то форму активности, вы должны позволить планировщику действительно что-то делать. Фоновый поток — один из способов добиться этого:

static void Main(string[] args)    
{
    StopMain = new ManualResetEvent(false);
    bool exit = false;

    new Thread(
        delegate 
        { 
            new RunHook(); 
            while(!exit) { Thread.Sleep(1); }                 
        }
    ).Start();

    StopMain.WaitOne();
    exit = true;
}

Другой - просто позволить основному потоку уступить:

static void Main(string[] args)    
{
    StopMain = new ManualResetEvent(false);

    RunHook runHook = new RunHook(); 

    while(!StopMain.WaitOne())
    {
        Thread.Sleep(1);
    }
}

Наверняка есть и другие способы. Лично я бы не стал делать ни то, ни другое. Вместо этого я бы добавил блокирующий метод в класс RunHook и заставил бы его возвращаться, когда он был выполнен или получил сигнал.

person ctacke    schedule 07.08.2009
comment
спасибо за Ваш ответ. Обычно я бы согласился не делать ничего из этого. Но я пытаюсь отключить кнопки телефона на наших устройствах, поэтому я никогда не хочу, чтобы это возвращалось (никогда, никогда). Я попробую эти и посмотреть, как они делают. - person Vaccano; 10.08.2009
comment
Увы, я попробовал оба этих метода, и они не сработали. Когда у класса RunHook было вызвано событие, оно заморозило систему. - person Vaccano; 26.08.2009