2009-08-07 2 views
0

У меня есть консольное приложение, которое я хочу постоянно запускать в фоновом режиме. Я подумал, что если я его запустил, а потом сказал, чтобы ждать, что все будет работать. Но когда я его дожидаю, он замораживает приложение.Non-terminating/non-blocking Windows Mobile App

Вот мой код:

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

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

ответ

2

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

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

+0

спасибо за ваш ответ. Обычно я бы согласился на то, чтобы ничего не делать. Но я пытаюсь отключить кнопки телефона на наших устройствах, поэтому я никогда не хочу, чтобы это возвращалось (никогда, никогда). Я дам им попробовать и посмотреть, как они это делают. – Vaccano

+0

Увы, я пробовал оба этих метода, и они не работали. Когда класс RunHook имел событие, называемое его, он заморозил систему. – Vaccano