2009-04-27 25 views
1

我有以下代碼爲WCF控制檯託管應用程序提供自動刷新功能。如何防止以下代碼中出現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 2009-04-27 01:15:15

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; 
    } 
} 
} 
相關問題