2009-08-07 11 views
0

J'ai une application de console que je veux exécuter en permanence en arrière-plan. Je pensais que si je l'ai commencé et lui ai dit d'attendre que les choses marchent. Mais quand je l'ai attendu, il gèle l'application.Application Windows Mobile sans terminaison/non bloquante

Voici mon code:

class Program {public static 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; 
    } 
} 

Toutes les idées sur la façon d'avoir cette course en arrière-plan, mais jamais fin?

Répondre

2

Le comportement que vous voyez est attendu. Vous avez un thread, et il est dans un état d'attente. Pour obtenir une forme d'activité, vous devez laisser le planificateur faire quelque chose. Un fil de fond est une façon d'y parvenir:

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; 
} 

Une autre est de laisser le rendement du fil primaire:

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

    RunHook runHook = new RunHook(); 

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

Il y a certainement d'autres façons aussi. Personnellement, je ne ferais ni l'un ni l'autre. Au lieu de cela, j'ajouterais une méthode de blocage à la classe RunHook et la ferais revenir quand elle a été faite ou signalée.

+0

merci pour votre réponse. Normalement, je serais d'accord pour ne rien faire. Mais j'essaie de désactiver les boutons du téléphone sur nos appareils, donc je ne veux jamais que cela revienne (jamais, jamais). Je vais essayer et voir comment ils font. – Vaccano

+0

Hélas, j'ai essayé ces deux méthodes et elles n'ont pas fonctionné. Lorsque la classe RunHook avait un événement appelé, il gelait le système. – Vaccano

Questions connexes