前提・実現したいこと
c#で複数のtimerを使って,呼び出すごとに周期を変更するということを考えています.
発生している問題・エラーメッセージ
個別にtimerの周期を変更することはできたのですが,配列を使ったらSystem.IndexOutOfRangeExceptionが出てしまいました.
要素の数は超えていないはずなので原因がわかりません
該当のソースコード
c#
using System; using System.Timers; namespace Sample { class Sample { static void Main() { int nmtr = 2; int min_pps = 500; int max_pps = 1500; System.Random rnd = new System.Random(1000); Timer[] timer = new Timer[nmtr]; for (int i = 0; i < nmtr; i++) { timer[i] = new Timer(); timer[i].Interval = rnd.Next(min_pps, max_pps); } for (int i = 0; i < nmtr; i++) { timer[i].Elapsed += (sender, e) => { Console.Write(i); timer[i].Stop(); //timer一時停止 ここでeeror発生 timer[i].Interval = rnd.Next(min_pps, max_pps); //周期変更 timer[i].Start(); //timer再開 }; } for (int i = 0; i < nmtr; i++) { timer[i].Start(); } Console.ReadKey(); } } }
試したこと
以下のように配列を使わずに個別に書いたら成功しましたが,文が長くなるので配列を使いたいです.
using System; using System.Timers; namespace Sample { class Sample { static void Main() { int min_pps = 500; int max_pps = 1500; System.Random rnd = new System.Random(1000); Timer timer1 = new Timer(); Timer timer2 = new Timer(); timer1.Interval = rnd.Next(min_pps, max_pps); timer2.Interval = rnd.Next(min_pps, max_pps); timer1.Elapsed += (sender, e) => { Console.Write(timer1.Interval); timer1.Stop(); //timer一時停止 timer1.Interval = rnd.Next(min_pps, max_pps); //周期変更 timer1.Start(); //timer再開 }; timer2.Elapsed += (sender, e) => { Console.Write(timer2.Interval); timer2.Stop(); //timer一時停止 timer2.Interval = rnd.Next(min_pps, max_pps); //周期変更 timer2.Start(); //timer再開 }; timer1.Start(); timer2.Start(); Console.ReadKey(); } } }
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/25 09:52