質問: お世話様です。 皆様の知識を貸して頂きたく、記載致します。 ☆やりたい事☆ AフォルダをSystem.IO.FileSystemWatcherで監視し、 B.CSVファイルがAフォルダに投入されたらその内容を解析して、その内容をDBに登録する。 Aフォルダは非同期で監視します。 ☆環境☆ OS:Windows10 64bit 言語:C# DB:SQLite ☆構想☆ ・フォルダ監視クラス ・投入されたファイルを管理するマネージャクラス ・ファイルの中身を解析する解析クラス ・SQL文を発行し、DBに登録するクラス ここで疑問になるのが、複数のファイルがAフォルダに投入される可能性があるため、 DBに登録している間に他のファイルが投入された場合はどこで待ち合わせを行えばよいのかが 分かりません。 マネージャクラス内部にListを定義しておき投入されたファイル名を順次登録して バッファのように使用しようと思っています。 その場合はフラグとタイマを使用してDBへの登録が完了したかをフラグに持たせておき、 タイマでその値を監視して、順次処理していけば良いのでしょうか? ぼんやりとは浮かんでいるのですが、具体的にどのクラスにどの役割をさせればいいのかが分かりません。 それとも、この他に何かよい方法があったりするのでしょうか? つたない文書で申し訳ありませんが、コメントやアドバイスを頂ければと思います。 ※構想の段階となりますのでソースをこちらに記載する事ができない事、ご了承ください。 よろしくお願い致します。
回答: 実装のヒント、アドバイスだけ。 * 基本線は提示の構想で良いのではないかと思います。 * 処理対象のファイルをバッファしておくのはListではなくBlockingCollectionのようなスレッドセーフなキューのほうが良いかと思います。 イベントが発生したら発生対象のファイルをキューに入れ、ファイルに対する処理は別スレッドで行えば良いかと。 * タイマーはなくても良いかも。無限ループでキューを監視するスレッドを作っておけば良いかと。ただしループ中に外から停止する仕組みは欲しいですね。 * FileSystemWatcherは監視対象に短時間で複数のイベントが発生した場合、変更の見落としが発生する場合があります。InternalBufferSizeを拡張して見落としを防止したり、見落とされても良いようにイベントハンドラ内の処理を実装する必要があります。