忙しかった2021年ももう残り19日という今日この頃、お家でぬくぬく冬眠しているクマさんです。
このアドベンドカレンダーを執筆するのも2回目ということで時の流れがとても早く感じています。

さて、今回はタイトルにあるように簡単なバッチ処理をC#で書いていこうと思います。なお、今年度のアドベントカレンダーでは僕はもう一回登場する予定なので、ちゃんと後編もありますよ。\(^_^)/
ちなみに僕が一番最初に触ったモダンなプログラミング言語は実はC#なんです。なんか、一周回って戻ってきた気分ですね。

そもそもバッチ処理とはなんぞや?

本題に入る前にバッチ処理とは何かを軽く説明しておきます。

バッチ処理とはデータ処理における方式の一種であり、逐次生み出されるデータを一定期間・一定量集めたものをバッチといい、このバッチ単位で処理を行うことが特徴です。そのため、データ処理において、さまざまなケースで使用されています。

バッチフレームワークを使ってみよう!

さて、実際にC#でバッチ処理を実装していくにあたって、全てを1から作るのは正直言って面倒です。そこで今回は、ウマ娘で話題のCygamesの技術開発子会社であるCysharpが開発しているConsoleAppFrameworkを使ってみようと思います。(余談ですが、先月行われていたCygames Tech Conferenceは興味をそそられる内容が盛り沢山でとても面白かったです。)

出典: https://github.com/Cysharp/ConsoleAppFramework

ConsoleAppFrameworkは、CLI(コマンドラインインターフェイス)ツール、デーモン、およびマルチバッチアプリケーションを作成するためのインフラストラクチャであり、.NET Generic Host上に構築されます。
また、メソッド呼び出しや柔軟な引数を設定できるという特徴を持っています。

実際に動かしてみよう!

まずは.NET CoreでConsole Applicationを作成します。そうしたら、NuGetを用いて先程のフレームワークをプロジェクトに追加しましょう。これで、事前準備は完了です。

手初めにProgram.cs内に下記のコードを実装します。

class Program
{
    static async Task Main(string[] args)
    {
        await Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync(args);
    }
}

このコードがConsoleAppFrameworkのEntry Pointになります。

次に簡単な処理を呼び出してみようと思います。

public class GreetingBatch : ConsoleAppBase
{
  public void Greet(string[] messages)
  {
    Parallels.ForEach(messages, item => { Console.WriteLine(item); });
  }
}

上記のコードは単純に受け取ったメッセージを並列処理を用いて標準出力しています。
これを

dotnet run greetingbatch greet -messages "Hello Bye"

とクラス、メソッド、引数を指定して実行するとコンソールに

Hello
Bye

と表示されます。
これでとりあえず、動かすことができました。

_

最後に

今回はバッチ処理を実装する下準備としてConsoleAppFrameworkを触って遊びました。
このフレームワークはとても簡単に処理を呼び出すことができ、引数も柔軟に設定できるので,
みなさんもぜひ、使ってみてください。

ちなみに後編ではこのフレームワークを用いて、いよいよバッチ処理を実装します。
お楽しみにしていてくださいね。

それでは、また23日の記事でお会いしましょう。
ありがとうございました。

参考文献

ConsoleAppFrameworkを試してみる

ConsoleAppFramework(旧MicroBatchFramework)を用いたAzure Functionsの実装例と良いところ紹介

クラウドネイティブ時代のC#バッチフレームワーク

バッチ処理-Wikipedia

Twitterでフォローしよう

おすすめの記事