
[code]

        private void Form1_Load(object sender, EventArgs e)
        {
    
            AutoResetEvent autoEvent = new AutoResetEvent(false);
            StatusChecker statusChecker = new StatusChecker();
    
            // Create the delegate that invokes methods for the timer.
            TimerCallback timerDelegate =
                new TimerCallback(statusChecker.CheckStatus);
    
            // タイマー起動
            Console.WriteLine("{0} タイマーを起動します.\n",
                DateTime.Now.ToString("h:mm:ss.fff"));
    
            System.Threading.Timer stateTimer =
                    //最後の２つの値→初動実行までの時間,実行間隔(ミリ秒)
                    new System.Threading.Timer(timerDelegate, autoEvent, 0, 10000);
    
            // タイマーの待機時間は-1にすると無制限になる(有限にしたい場合はミリ秒で記述)
            autoEvent.WaitOne(-1, false);
            //タイマーの開放
            stateTimer.Dispose();
    
        }
    
        class StatusChecker
        {
            public StatusChecker()
            {
            }
    
            // This method is called by the timer delegate.
            public void CheckStatus(Object stateInfo)
            {
                AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
    
                //ここに一定時間で実行したい処理を書く
                MessageBox.Show("テスト");
    
            }
        }
    
[/code]

例えば、 「テスト」という表示メッセージを消さなければ、  
一定時間後、タイマーで再び「テスト」と表示することをスルーしたいのですが、  
フラグによる操作しか方法はないでしょうか？

visual sutudio express 2015 windows 10 (64bit)


CC BY-SA 3.0
2017-07-19T12:38:23.770
36501
2018-01-31T09:03:11.670
2017-07-19T13:25:36.010
4236
12778
question
c#
C#のタイマーを同期させることは可能でしょうか？


`StatusChecker`インスタンスに必要な情報を持たせてやれば`autoEvent`だけでなく`stateTimer`を操作することも可能です。

[code]

    class StatusChecker {
        public AutoResetEvent AutoEvent { get; }
        public System.Threading.Timer StateTimer { get; }
        public StatusChecker(AutoResetEvent autoEvent, System.Threading.Timer stateTimer) {
            AutoEvent = autoEvent;
            StateTimer = stateTimer;
        }
    
[/code]

なお、.NET Frameworkには３種類のタイマーが存在します。

  * `System.Threading.Timer`： 低レベルタイマー
  * `System.Timers.Timer`： 低レベルタイマーをラップし扱いやすくしたもの
  * `System.Windows.Forms.Timer`： GUI専用タイマー、前２者とは無関係

説明からもわかると思いますが、`System.Threading.Timer`はあまり使用すべきではありません。最低限、`System.Timers.Timer`を使用した方が停止・再開が容易になります。ただしGUI処理を行うのであれば`System.Windows.Forms.Timer`を使うべきです。その場合、`AutoResetEvent`をそのまま待機してしまうとGUIがハングアップしてしまいます。  
いろいろと設計を見直す必要がありそうです。


CC BY-SA 3.0
2017-07-19T13:25:22.053
36503
2017-07-19T13:25:22.053
4236
36501
answer