C#で一定時間ごとに関数を実行するプログラムを作成してます。
大まかな処理の流れは以下です。
処理の流れ
func関数実行[1秒]→func関数実行→[1秒]→func関数実行→[3秒]→func関数実行→[1秒]→・・・
「func関数実行→[1秒]」が一つの処理の単位で、これがn回終われば3秒待つというような処理の流れです。
上記を実現するのに、以下ソースコードを書きました。
using System; using System.Windows; using System.Windows.Threading; namespace timerSamplePrj { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { DispatcherTimer timer= new DispatcherTimer(); string[] files = { "a", "b", "c" }; int fileIter = 0; public MainWindow() { InitializeComponent(); timer.Interval = TimeSpan.FromMilliseconds(0); timer.Tick += func; } private void func(object sender, EventArgs e) { Console.WriteLine("func関数で" + files[fileIter++] + "を実行中"); if (fileIter == files.Length) { fileIter = 0; timer.Interval = TimeSpan.FromMilliseconds(3000); } else { timer.Interval = TimeSpan.FromMilliseconds(1000); } } private void button_Click(object sender, RoutedEventArgs e) { Console.WriteLine("exec開始"); timer.Start(); } private void button1_Click(object sender, RoutedEventArgs e) { Console.WriteLine("exec終了"); fileIter = 0; timer.Stop(); timer.Interval = TimeSpan.FromMilliseconds(0); } } }
質問事項
上記ソースコードのように、timerのIntervalプロパティを変更する、というのは適切なのでしょうか(Intervalプロパティをプログラム実行中に変更し、待ち時間を変更させるというのは使い方が違う気がしてます)。
また、GUI上に配置するボタン押下で繰り返し実行処理を終了させたく、下記のようにwhile文ループで一度forループに入ると3回分の処理が実行されないよう、途中で処理を終了させるようにもしたいです。
while (終了ボタン押下されてない### ヘディングのテキスト) { for (int i = 0; i < 3; i++) { func(); await Task.Delay(1000); } await Task.Delay(3000); }
※過去に類似の質問もさせていただいたのですが、その派生で気になることがあり、再度質問させていただきます。
回答1件
あなたの回答
tips
プレビュー