そのため、大きなデータ ファイルの各レコード (行) を読み取り、これらの各行にさまざまな検証ルールを適用する必要があります。そこで、シーケンシャル バリデーションを適用するだけでなく、パイプライン処理を使用して高速化できるかどうかを確認することにしました。したがって、コレクション内のすべてのアイテムに同じ一連のビジネス検証ルール (現時点では 5 つ) を適用する必要があります。各検証プロセスから出力を返す必要がないため、ある検証ルーチンから別の検証ルーチンに値を渡すことについて心配する必要はありません。ただし、すべての検証ステップで同じデータを使用できるようにする必要があります。これを行うには、同じデータ (レコード) を 5 つの異なるバッファーに対処することを思いつきました。これは、各検証段階で使用されます。
以下は私が行っているコードです。しかし、これが適用されることにほとんど自信がなく、これを行うより良い方法があるかどうか知りたいですか? これについて何か助けていただければ幸いです。前もって感謝します。
public static void LoadBuffers(List<BlockingCollection<FlattenedLoadDetail>> outputs,
BlockingCollection<StudentDetail> students)
{
try
{
foreach (var student in students)
{
foreach (var stub in student.RecordYearDetails)
foreach (var buffer in outputs)
buffer.Add(stub);
}
}
finally
{
foreach (var buffer in outputs)
buffer.CompleteAdding();
}
}
public void Process(BlockingCollection<StudentRecordDetail> StudentRecords)
{
//Validate header record before proceeding
if(! IsHeaderRecordValid)
throw new Exception("Invalid Header Record Found.");
const int buffersize = 20;
var buffer1 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
var buffer2 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
var buffer3 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
var buffer4 = new BlockingCollection<FlattenedLoadDetail>(buffersize);
var taskmonitor = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.NotOnCanceled);
using (var loadUpStartBuffer = taskmonitor.StartNew(() => LoadBuffers(
new List<BlockingCollection<FlattenedLoadDetail>>
{buffer1, buffer2, buffer3, buffer4}, StudentRecords)))
{
var recordcreateDateValidationStage = taskmonitor.StartNew(() => ValidateRecordCreateDateActivity.Validate(buffer1));
var uniqueStudentIDValidationStage =
taskmonitor.StartNew(() => ValidateUniqueStudentIDActivity.Validate(buffer2));
var SSNNumberRangeValidationStage =
taskmonitor.StartNew(() => ValidateDocSequenceNumberActivity.Validate(buffer3));
var SSNRecordNumberMatchValidationStage =
taskmonitor.StartNew(() => ValidateStudentSSNRecordNumberActivity.Validate(buffer4));
Task.WaitAll(loadUpStartBuffer, recordcreateDateValidationStage, uniqueStudentIDValidationStage,
SSNNumberRangeValidationStage, SSNRecordNumberMatchValidationStage);
}
}
実際、1 つが失敗すると他のすべてのタスクが停止するようにタスクを結び付けることができれば、それは非常に役立ちますが、私はこのパターンの初心者であり、これを処理するための最良の方法を見つけようとしています。ここで私が抱えている問題。風に注意を払い、各検証ステップで出力バッファーをロードして後続のタスクに渡す必要がありますか? それはこれと一緒に行くより良い方法ですか?