2009-08-07 18 views
0

私はバックグラウンドで絶え間なく実行したいコンソールアプリケーションを持っています。私はそれを始めると、物事がうまくいくのを待つように言いました。しかし、私はそれが待っているとき、それはアプリケーションをフリーズする。ここで非終了/非ブロッキング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

表示される動作は予期されています。スレッドが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クラスにブロッキングメソッドを追加し、完了またはシグナル通知されたときに戻すようにしました。

+0

あなたの答えに感謝します。通常、私はこれらのどれもしないことに同意するでしょう。しかし、私はデバイスの電話ボタンを無効にしようとしているので、決してこれを返すことは決してありません。 私はこれらを試して、どのようにしているかを見ていきます。 – Vaccano

+0

悲しいかな、私はこれらの方法の両方を試してみましたが、うまくいきませんでした。 RunHookクラスに呼び出されたイベントがあったときに、システムがフリーズしました。 – Vaccano

関連する問題