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 に答える