Как предотвратить ошибку StackOverflow в следующем коде? - PullRequest
1 голос
/ 27 апреля 2009

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

Когда 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();
}

Ответы [ 2 ]

3 голосов
/ 27 апреля 2009

Заменить рекурсию циклом:

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 голосов
/ 27 апреля 2009

Похоже, что каждый раз, когда нажимается недопустимая клавиша, вы помещаете в стек еще один 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;
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...