Параллельное чтение нескольких XML-файлов и вставка в базу данных

#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);
  

Этот метод обеспечивает независимое чтение файлов с диска и запись данных в базу данных.