C#プログラミング

【WPF】C#で一定間隔で定期的に処理をする簡単な方法

定期的な処理実行記事のアイキャッチ画像 C#

C#(WPF)で一定間隔で処理を行う方法を紹介します。

活用できると自動で「何か処理をし続ける」というソフトが作れるようになります。うまく活用できれば作業の自動化ができるかも。

スポンサーリンク

定期的な処理機能の使い道

最初に思い浮かぶのは、ストップウォッチのような時間を計測するソフト・機能でしょう。

他には、データを一定期間受信した後、それらの受信回数と平均値を算出する機能などでも活用できるでしょう。

あとは定期的に状態を監視する機能でも活用できますね。

スポンサーリンク

定期的な処理の設定内容(DispatcherTimerの場合)

今回は、DispatcherTimerを用いる方法で行います。以下にすべきことを箇条書きします。

  • usingディレクティブ(System.windows.Threading)を追加
  • DispatcherTimerの宣言
  • 定期的な処理呼び出しの優先順位の設定
  • 処理の間隔の設定
  • 定期的に行われる(=呼び出される)処理の設定

これらを設定後、DispatcherTimerの「start」を実行すれば、「stop」されるまで定期的に処理が行われ続けます。

スポンサーリンク

サンプルプログラム

ボタンを押したら定期的に数値が表示されるソフトです。数値は一定間隔ごとに値が増えるようになっています。

実行結果は以下の通り(10カウント目でボタンを押して停止)。

サンプルソフトの出力結果

ついでにGUIは以下の通り。

ソフトの画面の様子

サンプルプログラムですが、MVVM形式で書いています。
本記事の本題とは関係ない部分は省略しています(ボタンのコマンドの部分など)。

MVVMでない方もMainViewModelを参考にすればできると思います。

MVVMのサンプルは以下記事を参考にしてください。

View

Viewはいあって平凡です。要所はViewModelの中にあります。

まずはXAMLから。

<Window x:Class="PeriodicProcessing.Views.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainView" Height="200" Width="250">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Button Grid.Row="0" Grid.Column="0" Content="START / STOP" Margin="20"
                Command="{Binding StartStop_Pushed}" />
    </Grid>
</Window>

コードビハインドは以下の通り。

using PeriodicProcessing.ViewModels;
using System.Windows;

namespace PeriodicProcessing.Views
{
    /// <summary>
    /// MainView.xaml の相互作用ロジック
    /// </summary>
    public partial class MainView : Window
    {
        public MainView()
        {
            InitializeComponent();

            MainViewModel vm = new MainViewModel();
            this.DataContext = vm;
        }
    }
}

ViewModel

ポイントとなる部分にはハイライトをつけています。

using PeriodicProcessing.Common;
using System;
using System.ComponentModel;
using System.Windows.Input;
using System.Windows.Threading;

namespace PeriodicProcessing.ViewModels
{
    public class MainViewModel:INotifyPropertyChanged
    {
        //タイマー動作フラグ
        public bool running_flg = false;
        //カウント用変数
        public int val;

        //コマンド
        public ICommand StartStop_Pushed { get; set; }

        //定期処理関連
        DispatcherTimer dt;

        public MainViewModel()
        {
            //コマンド
            StartStop_Pushed = new RelayCommand(StartStop_cmd);

            //DispatcherTimer関連設定--------------------------------
            //処理呼び出しの優先順位設定(特にこだわりがなければNormal)
            dt = new DispatcherTimer(DispatcherPriority.Normal);
            //間隔の設定
            dt.Interval = new TimeSpan(10000000);
            //定期的な処理を設定
            dt.Tick += new EventHandler(DT_Tick_Event);
            //-------------------------------------------------------
        }

        //コマンド(タイマーの開始・停止)
        private void StartStop_cmd()
        {
            if (running_flg == false)
            {
                val = 0;

                //定期処理を実行
                dt.Start();
                running_flg = true;

                Console.WriteLine("★カウント開始★");
            }
            else
            {
                //定期処理の停止
                dt.Stop();
                running_flg = false;

                Console.WriteLine("☆カウント終了☆");
            }
        }

        //定期的な処理イベント
        public void DT_Tick_Event(object sender,EventArgs e)
        {
            //値を1増やす
            val++;

            //表示
            Console.WriteLine(val.ToString());
        }
    }
}
スポンサーリンク

さいごに

要所を抑えれば単純ですね。少しずつ扱える機能を増やせば、イメージしたものが徐々に作れるようになりますね。

ちなみにこんな記事も書いています。グラフに興味ある方はぜひ↓↓

コメント

タイトルとURLをコピーしました