4

これは奇妙かもしれませんが、タイマーがあり、コンソールに書き込む Elapsed イベントのイベント ハンドラーがありますが、アプリケーションを起動すると、タイマーが適切に開始され、イベントも適切に発生します。ただし、ボタンを押した後以外は結果がコンソールに表示されないConsole.ReadKey()ため、アプリケーションが終了しないように2つ入れました。

のコードは次のProgram.csとおりです。

    static void Main(string[] args)
    {
        Timer timer = new Timer(100);
        timer.Elapsed += new ElapsedEventHandler(WriteOnConsole);
        timer.Start();
        Console.ReadKey();
        Console.ReadKey();
    }

    static void WriteOnConsole(object source, ElapsedEventArgs e)
    {
        Console.WriteLine("A B C D");
    }

十分な情報が記載されていない場合はお知らせください。

4

3 に答える 3

8

ReadKey()をブロックしWriteLine()ます。1 つのキーを押すと、最初のキーReadKeyが終了し、保留中のコンソールへの書き込みがフラッシュされます。

これは明らかに問題を示すための小さなサンプルにすぎないため、より良い代替案を提案することは困難です.

ある種の待機ハンドルを使用して、特定の条件が満たされた場合にのみアプリケーションを終了することができます。

于 2013-03-01T12:55:12.350 に答える
3

何よりも前に、最初のスレッドから空の文字列を書き込んでみてください。これにより、コンソールが初期化されます。

static void Main(string[] args)
{
    Console.Write(string.Empty);
    Timer timer = new Timer(100);
    timer.Elapsed += new ElapsedEventHandler(WriteOnConsole);
    timer.Start();
    Console.ReadKey();
    Console.ReadKey();
}

static void WriteOnConsole(object source, ElapsedEventArgs e)
{
    Console.WriteLine("A B C D");
}
于 2013-03-01T12:58:39.533 に答える
2

私はこれを別の質問で見ました-タイマーさえ必要ありません.1つのスレッドがコンソールから読み取り、別のスレッドが書き込みを行っている2つのスレッドだけです。

の初期化Consoleが多少壊れているようです。最初の呼び出しは、完了するまで効果的にロックを解除し、他のコンソール アクセスを妨げます。

あなたが書く場合:

Console.WriteLine("Starting");

たとえば、コードの開始時には、すべて問題ありません。一般に、すべてのコンソール出力をブロックReadKeyする(または他の読み取り操作)のとは異なります-最初の呼び出しだけです。

于 2013-03-01T12:58:04.950 に答える