C#WPFアプリ、コード構成の個人的なメモ

pythonやMQLをやっていると、時々スタンドアロンでアプリを作成したいときに、C#の構文とかを忘れたりします。よくprint()とか書いてしまします^^;

そんなときにすぐに思い出せるようにすごく個人的なメモです。もっと良いやり方や、そもそも冗長な処理をしているかもしれませんが、ご了承ください。

1.コンソールデバッグ

Console.WriteLine("文字列");

文字列は+で結合可能。

現在時間を入れたコンソール出力をしたい場合は、

Console.WriteLine(DateTime.Now.ToString() + "文字列");

と、することで、何時何分何秒のログかを出力できる。

2.スレッドの利用

順次処理ではなく、処理のトリガーだけを投げて、そのあとの処理は並列的に行いたいときに利用しています。

1つのトリガー(関数の呼び出し、Func()などと使用)で、ループ回数分の処理を行い、すべてのタスクが完了した時点で非同期関数Func()が完了するような処理。

using System.Threading.Tasks;

private async Func()
{
	var tasks = new List();
	
	for (int l = 0; l < タスク数; l++) { var task = Task.Run(() =>
		{
                       //タスクの処理
		});
		tasks.Add(task);
	}
	await Task.WhenAll(tasks);//すべてのタスクが完了するのを待つ。
}

3.タイマースレッドの利用

タイマースレッド、という言葉が正しいのか、わかりません^^;

GUIスレッドとは別の処理として一定時間間隔に何かの処理をしたいときに使います。タイマーにもいろいろ種類がありますが、使用しているのはサーバーベースタイマーというものです。

参考サイト:https://www.atmarkit.co.jp/ait/articles/0511/11/news119.html

↑サイトの、ラムダ式で簡潔に記述する、部分を使用させていただいてます。

一定時間で処理する内容を定義する関数

private void SetupTimer()
{
    // タイマの初期化と開始
   Timer _timer = new Timer(1000);//1秒間隔指定
    // ElapsedEventHandlerをラムダ式で定義
    _timer.Elapsed += (s, e) => {
    //タイマーの処理

    };
    _timer.Start();

   this.Closing += (s, e) => {
        // 画面が閉じられるときに、タイマを停止して破棄
        _timer_bybit.Stop();
        _timer_bybit.Dispose();
   };
}

上記処理を開始する関数

SetupTimer();

ただ呼び出すだけです^^;

4.GUIスレッドへのデータ渡し

Invokeという別スレッドでの変数等データをGUIスレッドへ渡すテクを使います。

上記のようなタイマースレッドや、並列にした処理中の値をGUIに表示したいときなどによく使います。

よくエラーデータをGUIのラベルなどに表示します。そのときは、次の関数を定義しておきます。

private void Error_Disp(string str)
{
    //Invoke処理でGUIスレッドへも変数を渡すことができる。
    this.Dispatcher.Invoke((Action)(() =>
    {
        Label.Content = str;
    }));
}

上記関数を定義しておけば、並列処理をしているスレッドの中で

Error_Disp("こんなエラー");

とすることで、文字列をInvokeでGUIのオブジェクトに渡すことができます。

Printみたいに使えて便利です。

5.データのファイル出力

ファイルのオープン、クローズ等、明示的に書くのは面倒だといつも思います。

File.AppendAllText(@"test.txt", DateTime.Now.ToString() + "," + "データ" + "\n");

これを記述すると、指定のファイル(test.txt debagモードで動作しているときは、プロジェクトのbinフォルダのdebugの直下に作成される。)にどんどん追加していってくれてとりあえずファイル出力の時に便利です。

上記データ形式は、「時間+カンマ+データ」で、一行毎に改行を入れてテキストエディタで開いたときに見やすくしています。

カンマ区切りのため、csvとしてpythonなどでもデータ加工がしやすくて重宝しています。

以上、未来の自分にむけてつぶやきです^^;

Posted in C#