Неразрывное / неблокирующее приложение для Windows Mobile - PullRequest
0 голосов
/ 07 августа 2009

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

Вот мой код:

Программа класса { статический 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;
    }
}

Какие-нибудь идеи о том, как запустить этот процесс в фоновом режиме, но никогда не завершать?

1 Ответ

2 голосов
/ 08 августа 2009

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

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 и вернул бы его, когда это будет сделано или сигнализировано.

...