консольное приложение .net перестает отвечать при печати множества символов подряд - PullRequest
2 голосов
/ 26 мая 2009

Я пытаюсь выяснить, почему программа, над которой я работаю, переходит в режим «не отвечает», когда я прошу ее вывести большое количество символов на консоль, в которой она работает.

Я попытался создать небольшой пример, который просто распечатывает символы, и это действительно также "не отвечает" мне через 10-20 секунд:

static void Main(string[] args)
{
    for (int i = 0; i < 255; i = (i+1) % 255)
    {
        Console.Write(((char)i));

    }
}

Программа все еще работает, хотя, хотя окно консоли «не отвечает», я все еще могу приостановить отладчик и продолжить его, но окно консоли не работает.

Дело в том, что консоль не против выплевывать бесконечное количество целых чисел:

static void Main(string[] args)
{
    for (int i = 0; i < 255; i = (i+1) % 255)
    {
        Console.Write(i);            
    }
}

Любые идеи очень ценятся. Спасибо!

Ответы [ 3 ]

5 голосов
/ 26 мая 2009

Когда вы приводите его к персонажу, вы также отправляете управляющие символы на консоль для некоторых более низких значений i. Я предполагаю, что это как-то связано с повторным выводом некоторых из этих управляющих символов.

4 голосов
/ 26 мая 2009

Ну, это извергнет много бессмыслицы (и издаст много звукового сигнала, если вы не замаскируете символ 7, который является звонком), но это никогда не станет для меня безразличным.

Это будет зависеть от того, как ваша консоль обрабатывает управляющие символы - какую консоль вы используете, на какой операционной системе и на каком языке?

Кроме того, почему вы хотите отправлять непечатаемые символы на консоль? Если вы продолжите цикл ASCII (32-126), что произойдет? Например:

using System;

class Test
{   
    static void Main(string[] args)
    {
        int i=32;
        while (true)
        {
            Console.Write((char)i);
            i++;
            if (i == 127)
            {
                i = 32;
            }
        }
    }
}

Это все еще демонстрирует такое же поведение?

Вы упомянули отладчик - у вас будет такое же поведение, если вы запускаете вне отладчика? (До сих пор я тестировал только из командной строки.)

1 голос
/ 27 мая 2009

Так же, как в стороне, вы можете опустить i<255 и просто написать: for (int i = 0; ;i = (i+1) % 255 )

или чтобы ответить на вопрос Джона, вы можете упростить это так:

using System;

class Test
{   
    static void Main(string[] args)
    {

        for(var i=0;;i=(i+1) % 126)
        {
            Console.Write((char)(i+32));
        }
    }
}
...