#c# #xml #task-parallel-library
#c# #xml #задача-параллельная библиотека
Вопрос:
В качестве повышения производительности я хочу параллельно прочитать 10 XML-файлов и вставить данные в базу данных.
1. Как добиться параллельного чтения и вставки базы данных? т.е. когда один файл считывает данные вставки из уже прочитанного XML-файла.
2.Как добиться параллельной обработки нескольких XML-файлов (включая чтение и вставку в базу данных). т.е. одновременной обработки 10 файлов. Язык C#
Used Task.Factory.StartNew(() => Method1(), CancellationToken.None,
TaskCreationOptions.LongRunning, TaskScheduler.Default);
но метод внутри Method1() вызывается только один раз.
Комментарии:
1.
Parallel.ForEach(...)
msdn.microsoft.com/en-us/library/…2. Даже параллельно. ForEach() дает те же результаты. Метод2(), который находится внутри Метода1(), вызывается только один раз.
3. итак, вы хотите, чтобы один поток читал диск, а другой записывал в базу данных? используйте внутреннюю очередь. msdn.microsoft.com/en-us/library/dd267265 (v = против 110).aspx
4. Если у меня есть 19 входных файлов, то я хочу обработать 5 файлов параллельно в одном пакете, затем оставшиеся 9 файлов параллельно в другом пакете.
5. это 14… что вы делаете с другим 5. в любом случае используйте
Parallel.ForEach
и позвольте компьютеру решить пакетную обработку.
Ответ №1:
Используйте стандартный шаблон производитель / потребитель.
var xmlFiles = new BlockingCollection<XDocument>();
var readFiles = Task.Run(() =>
{
try
{
foreach (var file in Directory.EnumerateFiles(".", "*.xml"))
xmlFiles.Add(XDocument.Load(file));
}
finally { xmlFiles.CompleteAdding(); }
});
var processFiles = Task.Run(() =>
{
foreach (var xml in xmlFiles.GetConsumingEnumerable())
{
// Insert data to database
}
});
Task.WaitAll(readFiles, processFiles);
Этот метод обеспечивает независимое чтение файлов с диска и запись данных в базу данных.