1

ac# チュートリアルの例に従って、一定の時間が経過したときにタイマー クラスからイベントをトリガーしようとしていますが、うまくいかないようです。
コードは次のとおりです。

class Program
{
    static void Main(string[] args)
    {
        System.Timers.Timer tmr = new System.Timers.Timer();
        tmr.Elapsed += new ElapsedEventHandler(TimerTickHandler);
        tmr.Interval = 1000;
        tmr.Enabled = true;
        Console.ReadKey();
    }

    public static void TimerTickHandler(object sender, ElapsedEventArgs e)
    {
        Console.Write("\rprinting: {0}", e.SignalTime.ToString());
    }

}

私は TimerTickHandler を経過イベントに添付し、1秒ごとに時間を画面に出力する必要がありますが、出力が得られません。
どこが間違っているのか手がかりはありますか?
助けてくれてありがとう。

4

1 に答える 1

3

Console.ReadKey()に変更してこれを修正しConsole.ReadLine()ます。

がコンソール アプリのマルチスレッドに奇妙な影響を与える理由について説明しているスレッドをConsole.ReadKey()次に示します。

基本的に、ロックを取得しようとConsole.ReadKey()する内部オブジェクトをロックしました。Console.Write()したがって、タイマーが切れると、Console.Write()それを報告するために使用している がブロックされます。これは、使用したいConsole.ReadKey()同じオブジェクトがロックされているためです。Console.Write()

これは のバグだと思いConsole.ReadKey()ます。I/O の待機中にロックを保持することは、常にバグです。

Console.Write()また、を to に変更しDebug.WriteLine()てデバッガをアタッチすれば、そのままでも動作するので注意してくださいConsole.ReadKey()

于 2013-03-29T11:34:20.137 に答える