-3

私の C# アプリケーションでは、タイマーに基づいてメソッドを呼び出す必要があります。プログラムを開始すると、タイマーが開始され、10 秒ごとにメソッドが呼び出されます。

2 番目 - 10 秒のスパンの有効期限が切れる前にメソッドを手動で呼び出した場合、タイマーをリセットし、実行から 10 秒待機します (発生したときに起動しません)。つまり、タイマーの残り時間が 6 秒で、手動でトリガーした場合、タイマーを 10 秒待機させたいのですが、6 秒では起動しません。

  1. このようなタイマーを作成する最良の方法は何ですか?
  2. タイマーを取得したら、手動で有効期限を効果的に制御するにはどうすればよいですか?
4

1 に答える 1

1

System.Timer.Timerクラスは、必要なものすべてに適しています。

タイマーを開始してから、10 秒ごとにメソッドを呼び出します。

この最初の部分は簡単です。interval プロパティを 10000 に設定し AutoResetプロパティを trueに設定して、 Elapsedイベントを処理する必要があります。

2 番目 - 10 秒のスパンの有効期限が切れる前にメソッドを手動で呼び出した場合、タイマーをリセットし、実行から 10 秒待ちます。

手動でトリガーすることは、実際にはそれほど簡単ではありません。最善の方法は、それを停止し、経過したイベントで実行しようとしていたことをすべて実行してから、再起動することです。

ただし、これには大きな注意点があります。タイマーは手動でトリガーされたスレッドとは別のスレッドで実行されるため、処理メソッドが再入可能であることを確認する必要があります。これは、メソッドの実行に 10 秒かかる場合にも問題になります。ロックを使用するのが最も簡単な方法です。

タイマーのデモンストレーションとして、Enter キーを押すと手動で起動し、2 秒待ってから再び起動する小さなプログラムを次に示します。

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

        var timer = new System.Timers.Timer();
        timer.Interval = 2000; // 2 seconds here
        timer.AutoReset = true; //Restart 


        Action<object, EventArgs> Elapsed = (object o, EventArgs e) => Console.WriteLine(DateTime.Now);

        timer.Elapsed += new System.Timers.ElapsedEventHandler(Elapsed);
        timer.Start();
        while (Console.ReadLine() != "quit")
        {
            timer.Stop();
            Elapsed.Invoke(new object(), EventArgs.Empty);
            timer.Start();

        }
    }
}
于 2012-12-04T19:11:36.903 に答える