2009-04-27 15 views
1

WCF Console Hosted Applicationにオートリフレッシュ機能を提供する次のコードがあります。次のコードで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; 
    } 
} 
} 
関連する問題