Для файлов размером более 2000 строк мы достигаем BucketSize и останавливаем цикл while, поэтому дубликаты не возникают.
Однако, если файлы короче размера сегмента, должно произойти следующее: метод Read/ReadAsync должен возвращать false при достижении конца файла. Вместо этого происходит то, что при достижении последней строки программа чтения снова начинает работать с указанным индексом, а метод Read/ReadAsync возвращает false только после полного второго запуска. Это приводит к дублированию значений.
Код: Выделить всё
public async Task StartProcessingBatchAsync(Stream stream, long index, CancellationToken token)
{
_logger.LogInformation("Processing CSV async");
using var reader = new StreamReader(stream);
using var csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = CsvHasHeaderRecord });
csv.Context.RegisterClassMap(_modelMap);
stream.Position = 0;
csv.Read();
csv.ReadHeader();
stream.Position = index;
var modelsList = new List();
var errorCount = 0;
var rowCounter = 0;
_logger.LogInformation($"Reading {_configuration.BucketSize} items starting from index: {stream.Position}");
while(await csv.ReadAsync() && rowCounter < _configuration.BucketSize)
{
TModel record;
try
{
record = csv.GetRecord();
Guard.NotNull(record, nameof(record));
}
catch
{
errorCount++;
continue;
}
modelsList.Add(record);
rowCounter++;
}
_logger.LogInformation($"Found {errorCount} errors out of {_configuration.BucketSize} items");
return modelsList;
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... cates-data