Параллельный ForEach не сохраняет данные точно при обработке больших данных в текстовый файл [закрыто] ⇐ C#
-
Anonymous
Параллельный ForEach не сохраняет данные точно при обработке больших данных в текстовый файл [закрыто]
У меня есть тысячи данных, обрабатываемых в Parallel.ForEach с сегментацией, чтобы сократить обрабатываемые данные и работать намного быстрее, но проблема в том, что данные не точны. Он продолжает меняться при повторном запуске одного и того же файла. Он возвращает повторяющиеся записи, но при повторном запуске конкретных данных, которые имеют дубликаты, проблема не возникает. Как использовать Parallel.ForEach, чтобы не повлиять на процесс обработки данных при обработке больших данных?
Я не уверен, влияет ли на это MaxDegreeOfParallelism? Какой именно параллелизм следует использовать для Parallel.ForEach?
Ниже приведена функция Parallel.ForEach, которая циклически обрабатывает список.
Parallel.ForEach(distinctExpandedList, new ParallelOptions() { MaxDegreeOfParallelism = 50 }, (distinctExpand,loopState) => { строка tTransformedTableNumberFinal = ""; если (distinctExpandedList.IndexOf(distinctExpand) > 0) { tTransformedTableNumberFinal = tTransformedTableNumber + DifferentExpandedList.IndexOf(distinctExpand).ToString(); } еще { tTransformedTableNumberFinal = tTransformedTableNumber; } строка IndexNumber = DifferentExpandedList.IndexOf(distinctExpand).ToString(); foreach (var disEx в DifferentExpand) { пытаться { строка расширеннаяTempTableNumberFinal = ""; если (IndexNumber != "0") { расширенныйTempTableNumberFinal = расширенныйTempTableNumber + IndexNumber; } еще { расширенныйTempTableNumberFinal = расширенныйTempTableNumber; } InsertRowsToDatabase(expandedList.Where(e => e.PartNo.Equals(disEx.PartNo) && e.PDISON.Equals(disEx.PDISON)).ToList(), расширенныйTempTableNumberFinal); FirebirdTransaction firebirdTransaction = ПолучитьFirebirdTransactionForUpdating(TransactionId); //logMessages("Чтение отдельного номера развернутой детали транзакции " + disEx.PartNo + ".", TransactionId, 5, Int32.Parse(disEx.PartNo)); if (firebirdTransaction.Status == "Отменено") { транзакцияОтменена = Истина; } if (firebirdTransaction.Status == "Сброс") { транзакцияReset = правда; } если (транзакцияReset) { UpdateFirebirdTransactionReset(TransactionId); logMessages("Перезапустить транзакцию", TransactionId, 6, 0); //loopState.Stop(); возвращаться; } если (транзакция отменена) { UpdateFirebirdTransactionCancel(TransactionId); logMessages("Отмена транзакции", TransactionId, 6, 0); //loopState.Stop(); возвращаться; } еще { ContractServiceexpandContracter = новый ContractService(TransactionId, VehicleMap_Firebird, Vehicle); expandContracter.ProcessContract(disEx, tTransformedTableNumberFinal,expandedTempTableNumberFinal); //logMessages("Обработка номера детали отдельной записи завершена" + disEx.PartNo + ".", TransactionId, 5, Int32.Parse(disEx.PartNo)); если (транзакция отменена) { UpdateFirebirdTransactionCancel(TransactionId); logMessages("Отмена транзакции", TransactionId, 6, 0); //loopState.Stop(); возвращаться; } если (транзакцияReset) { UpdateFirebirdTransactionReset(TransactionId); logMessages("Перезапустить транзакцию", TransactionId, 6, 0); // LoopState.Stop(); возвращаться; } UpdateFirebirdTransactionProgress(TransactionId); //logMessages("Обновленное задание транзакции.", TransactionId, 5, Int32.Parse(disEx.PartNo)); } } поймать (Исключение ex) { logMessages("Ошибка параллельной обработки Foreach. " + ex.Message + ". " + ex.InnerException, TransactionId, 5, Int32.Parse(disEx.PartNo)); } } } );
У меня есть тысячи данных, обрабатываемых в Parallel.ForEach с сегментацией, чтобы сократить обрабатываемые данные и работать намного быстрее, но проблема в том, что данные не точны. Он продолжает меняться при повторном запуске одного и того же файла. Он возвращает повторяющиеся записи, но при повторном запуске конкретных данных, которые имеют дубликаты, проблема не возникает. Как использовать Parallel.ForEach, чтобы не повлиять на процесс обработки данных при обработке больших данных?
Я не уверен, влияет ли на это MaxDegreeOfParallelism? Какой именно параллелизм следует использовать для Parallel.ForEach?
Ниже приведена функция Parallel.ForEach, которая циклически обрабатывает список.
Parallel.ForEach(distinctExpandedList, new ParallelOptions() { MaxDegreeOfParallelism = 50 }, (distinctExpand,loopState) => { строка tTransformedTableNumberFinal = ""; если (distinctExpandedList.IndexOf(distinctExpand) > 0) { tTransformedTableNumberFinal = tTransformedTableNumber + DifferentExpandedList.IndexOf(distinctExpand).ToString(); } еще { tTransformedTableNumberFinal = tTransformedTableNumber; } строка IndexNumber = DifferentExpandedList.IndexOf(distinctExpand).ToString(); foreach (var disEx в DifferentExpand) { пытаться { строка расширеннаяTempTableNumberFinal = ""; если (IndexNumber != "0") { расширенныйTempTableNumberFinal = расширенныйTempTableNumber + IndexNumber; } еще { расширенныйTempTableNumberFinal = расширенныйTempTableNumber; } InsertRowsToDatabase(expandedList.Where(e => e.PartNo.Equals(disEx.PartNo) && e.PDISON.Equals(disEx.PDISON)).ToList(), расширенныйTempTableNumberFinal); FirebirdTransaction firebirdTransaction = ПолучитьFirebirdTransactionForUpdating(TransactionId); //logMessages("Чтение отдельного номера развернутой детали транзакции " + disEx.PartNo + ".", TransactionId, 5, Int32.Parse(disEx.PartNo)); if (firebirdTransaction.Status == "Отменено") { транзакцияОтменена = Истина; } if (firebirdTransaction.Status == "Сброс") { транзакцияReset = правда; } если (транзакцияReset) { UpdateFirebirdTransactionReset(TransactionId); logMessages("Перезапустить транзакцию", TransactionId, 6, 0); //loopState.Stop(); возвращаться; } если (транзакция отменена) { UpdateFirebirdTransactionCancel(TransactionId); logMessages("Отмена транзакции", TransactionId, 6, 0); //loopState.Stop(); возвращаться; } еще { ContractServiceexpandContracter = новый ContractService(TransactionId, VehicleMap_Firebird, Vehicle); expandContracter.ProcessContract(disEx, tTransformedTableNumberFinal,expandedTempTableNumberFinal); //logMessages("Обработка номера детали отдельной записи завершена" + disEx.PartNo + ".", TransactionId, 5, Int32.Parse(disEx.PartNo)); если (транзакция отменена) { UpdateFirebirdTransactionCancel(TransactionId); logMessages("Отмена транзакции", TransactionId, 6, 0); //loopState.Stop(); возвращаться; } если (транзакцияReset) { UpdateFirebirdTransactionReset(TransactionId); logMessages("Перезапустить транзакцию", TransactionId, 6, 0); // LoopState.Stop(); возвращаться; } UpdateFirebirdTransactionProgress(TransactionId); //logMessages("Обновленное задание транзакции.", TransactionId, 5, Int32.Parse(disEx.PartNo)); } } поймать (Исключение ex) { logMessages("Ошибка параллельной обработки Foreach. " + ex.Message + ". " + ex.InnerException, TransactionId, 5, Int32.Parse(disEx.PartNo)); } } } );
Мобильная версия