none
System.Timers.Timerが止まらない RRS feed

  • 質問

  • こんにちは。C言語を学生のころ習得しており、C#は初心者の者です。

    タイマーを2つ用意して、1つ目のタイマー内でリストに値を格納し、5つ分取得できたら次のタイマーに移動し別の処理をする動作を実現したく、下のコードを書きました。

    しかし実行してみるとデバッグを終了するまでリストに値を格納し続けてしまいます。

    解決策をご教示いただければ幸いです。

    よろしくお願いいたします。

    public partial class Main : Form
    {
    int i = 0;

    public Main()
    {
                InitializeComponent();

                var timer3 = new System.Timers.Timer();
                timer3.Elapsed += new ElapsedEventHandler(OnElapsed_TimersTimer3);
                timer3.Interval = 1000;
                timer3.Start();


                var timer5 = new System.Timers.Timer();
                timer5.Elapsed += new ElapsedEventHandler(OnElapsed_TimersTimer5);
                timer5.Interval = 1000;
                timer5.Stop();
    }

    private async void OnElapsed_TimersTimer3(object sender, ElapsedEventArgs e)
    {
                値を取得しリストへ格納
                if (i == 4)
                {
                    timer3.Stop();
                    timer5.Start();
                }
                i++;

    }

    private async void OnElapsed_TimersTimer5(object sender, ElapsedEventArgs e)
    {
    ここである処理をする

    }

               
    2017年8月12日 23:22

回答

  • Mainコンストラクター内で実行している var timer3 = new System.Timers.Timer(); はメソッド内のローカル変数です。対して、OnElapsed_TimersTimer3イベントハンドラー内で捜査しているtimer3はクラスフィールドです。両者で別オブジェクトを操作しているため意図通りの動作とはなりません。

    Mainコンストラクター内での処理で「var」を削除して timer3 = new System.Timers.Timer(); とすることでクラスフィールドへ代入できます。

    2017年8月12日 23:32

すべての返信

  • Mainコンストラクター内で実行している var timer3 = new System.Timers.Timer(); はメソッド内のローカル変数です。対して、OnElapsed_TimersTimer3イベントハンドラー内で捜査しているtimer3はクラスフィールドです。両者で別オブジェクトを操作しているため意図通りの動作とはなりません。

    Mainコンストラクター内での処理で「var」を削除して timer3 = new System.Timers.Timer(); とすることでクラスフィールドへ代入できます。

    2017年8月12日 23:32
  • ありがとうございます。解決しました。

    マウスオーバーしたところオブジェクトの種類を確認することができました。

    ありがとうございました。

    2017年8月12日 23:57