2009-08-07 34 views
0

我有一個控制檯應用程序,我想在後臺持續運行。我認爲,如果我開始它,然後告訴它等待事情會起作用。但是當我等待時,它會凍結應用程序。非終止/非阻止Windows Mobile應用程序

這裏是我的代碼:

類節目 { 靜態公共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 2009-08-10 17:38:21

+0

唉,我嘗試了這兩種方法,但都沒有奏效。當RunHook類有一個事件叫它凍結系統。 – Vaccano 2009-08-26 18:33:11