因此,我需要读取大型数据文件的每条记录(行),然后在每一行上应用各种验证规则。因此,我决定不只是应用顺序验证,而是决定看看是否可以使用一些流水线来帮助加快速度。因此,我需要将同一组业务验证规则(目前为 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);
}
}
事实上,如果我能以这样一种方式捆绑任务,一旦一个失败,所有其他人都停止,那将对我有很大帮助,但我是这种模式的新手,并且试图找出处理这个问题的最佳方法我在这里遇到的问题。我是否应该小心翼翼地让每个验证步骤都加载一个输出缓冲区以传递给后续任务?这是一个更好的方法吗?