私は FileShare クローラーを持っています (権限を取得し、後で監査するためにそれらをどこかにドロップします)。現在、同じフォルダーをクロールするために複数のスレッドを開始しています (プロセスを高速化するため)。
C# では、各オブジェクトには、呼び出しによって開始されるSqlConnection
独自のがあります。SqlTransaction
SqlConnection.BeginTransaction()
現在のソリューションの疑似コードは次のとおりです。
- フォルダのリストを取得する
- 各フォルダについて、サブフォルダのリストを取得します
- サブフォルダーごとにスレッドを開始して、ファイル共有を収集します
- 各スレッドは収集したデータをデータベースに保存します
- データベースで監査レポートを実行する
サブフォルダのスレッドの 1 つが失敗すると、問題が発生します。「簡単に検出できない」部分的なフォルダ スキャンに行き着きます。主な理由は、各スレッドが別々の接続で実行されていることです。
不完全なスキャンを行うのではなく、各フォルダーを同じトランザクションでコミットしたいと考えています (現在の状況では、一部のスレッドが失敗した場合)。トランザクションの概念は実装されていませんが、オプションを評価しています。
この回答のコメントに基づいて、プロデューサー/コンシューマーキューはオプションですが、残念ながらメモリは制限されています(開始されたスレッドの数による)。プロデューサ/コンシューマ スペースが RAM 制限を克服するためにディスクにコミットされている場合、実行時間は増加します (メモリ I/O と比較してディスク I/O が非常に限られているため)。私はメモリ/時間の妥協で立ち往生していると思います。他の提案はありますか?