2009-04-27 6 views
1

J'ai le code suivant qui fournit une fonction d'actualisation automatique à une application hébergée WCF Console. Lorsque la Console.ReadKey accepte un caractère non valide, elle redémarre la méthode ReadKey. Si l'utilisateur écrase le clavier assez longtemps sur ce code, il passe dans une exception StackOverflowException.Comment empêcher une erreur StackOverflow dans le code suivant?

Est-ce que quelqu'un a un moyen de réécrire ce code afin qu'il ne fasse pas souffler la pile?

[STAThread] 
static void Main(string[] args) 
{ 
    bool restart = true; 
    while(restart) 
    { 
     using (var myWcfHost = new MyWcfHost()) 
     { 
      myWcfHost.start(); 

      Console.WriteLine("Press Enter to quit or Ctrl+R to restart"); 

      restart = WaitForRestart(); 
     } 
    } 
} 

private static bool WaitForRestart() 
{ 
    // clear users input 
    Console.CursorLeft = 0; 
    Console.Write(' '); 
    Console.CursorLeft = 0; 

    // read users input 
    var key = Console.ReadKey(); 
    if ((key.Modifiers & ConsoleModifiers.Control) != 0 
     && key.Key == ConsoleKey.R) 
    { 
     // refersh the settings 
     ConfigurationManager.RefreshSection("appSettings"); 
     return true; 
    } 
    if (key.Key == ConsoleKey.Enter || key.Key == ConsoleKey.Escape) 
    { 
     return false; 
    } 
    return WaitForRestart(); 
} 

Répondre

3

Remplacer récursion avec une boucle:

private static bool WaitForRestart() 
{ 
    while (true) 
    { 
     // clear users input 
     Console.CursorLeft = 0; 
     Console.Write(' '); 
     Console.CursorLeft = 0; 

     // read users input 
     var key = Console.ReadKey(); 
     if ((key.Modifiers & ConsoleModifiers.Control) != 0 
      && key.Key == ConsoleKey.R) 
     { 
      // refersh the settings 
      ConfigurationManager.RefreshSection("appSettings"); 
      return true; 
     } 
     if (key.Key == ConsoleKey.Enter || key.Key == ConsoleKey.Escape) 
     { 
      return false; 
     } 
    } 
} 
+0

J'ai regardé cela pour toujours, j'ai finalement décidé de poster et j'ai pensé à cela juste après avoir posté. Merci, ça fonctionne. – bendewey

0

On dirait que chaque fois qu'il ya une touche invalide enfoncée, vous appuyez sur une autre WaitForRestart sur la pile, entraînant finalement une exception de débordement. Je pense que cela réglerait:

private static bool WaitForRestart() 
{ 
// clear users input 
Console.CursorLeft = 0; 
Console.Write(' '); 
Console.CursorLeft = 0; 


while (true) 
{ 
    // read users input 
    var key = Console.ReadKey(); 
    if ((key.Modifiers & ConsoleModifiers.Control) != 0 
     && key.Key == ConsoleKey.R) 
    { 
     // refersh the settings 
     ConfigurationManager.RefreshSection("appSettings"); 
     return true; 
    } 
    if (key.Key == ConsoleKey.Enter || key.Key == ConsoleKey.Escape) 
    { 
     return false; 
    } 
} 
} 
Questions connexes