2

我试图弄清楚为什么当我要求我正在处理的程序向它正在运行的控制台输出大量字符时,它会进入“无响应”模式。

我尝试创建一个仅打印字符的小示例,这确实会在大约 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);            
    }
}

任何想法都非常受欢迎。谢谢!

4

3 回答 3

5

当您将其转换为字符时,您还将控制字符发送到控制台以获得一些较低的i. 我猜这与重复输出其中一些控制字符有关。

于 2009-05-26T19:52:49.940 回答
4

好吧,它会吐出很多废话(并且会发出很多哔哔声,除非你掩盖了字符 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;
            }
        }
    }
}

那仍然表现出相同的行为吗?

你提到了调试器——如果你在调试器之外运行,你会得到相同的行为吗?(到目前为止,我只从命令行进行了测试。)

于 2009-05-26T19:55:51.713 回答
1

顺便说一句,您可以省略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));
        }
    }
}
于 2009-05-27T07:16:50.757 回答