2009-04-27 2 views
1

У меня есть следующий код, который предоставляет функцию автоматического обновления для хостингового приложения WCF Console.Как предотвратить ошибку StackOverflow в следующем коде?

Когда Console.ReadKey принимает недопустимый символ, он перезапускает метод ReadKey. Если пользователь сбрасывает клавиатуру достаточно долго на этом коде, он перейдет в исключение StackOverflowException.

Есть ли у кого-нибудь способ переписать этот код, чтобы он не вызывал удар стека?

[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(); 
} 

ответ

3

Заменить рекурсию с петлей:

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

Я смотрел на это навсегда, наконец решил отправить сообщение, и я подумал об этом сразу после того, как отправил. Спасибо, это работает. – bendewey

0

Похоже, каждый раз, когда есть недействительный ключ нажата, вы нажимаете другую WaitForRestart в стек, в конечном счете, в результате исключения переполнения. Я думаю, что это исправит:

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; 
    } 
} 
} 
Смежные вопросы