C # запуск нескольких процессов. Запуск () в асинхронном режиме - PullRequest
0 голосов
/ 25 марта 2019

У меня есть папка, содержащая несколько файлов PCL, которые необходимо преобразовать в PDF.Я могу добиться этого с помощью стороннего exe.Чтобы ускорить это, я пытаюсь запустить несколько Tasks (), каждая из которых запускает новый System.Diagnostics.Process, используя exe;

System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo.FileName = $@".\WinPCLtoPDF\WinPCLtoPDF.exe";
            process.StartInfo.Arguments = $@"{StepParameters["StagingFileName"]} {StepParameters["StagingFileName"]}.pdf batch";
            process.Start();
            process.WaitForExit();

Задачи добавляются в List<Task>, и каждая ожидаетсядо выхода из программы.

            foreach (FileInfo fileInfo in files)
            {
                tasks.Add(ProcessDocumentTaskAsync(batchType, fileInfo, deleteOriginalFile));

                while (tasks.Count < files.Count() && tasks.Where(x => !x.IsCompleted).Count() > concurrentTasks)
                {
                    Thread.Sleep(50);
                }
            }

Задачи создаются с помощью метода, подобного следующему.

        private async static Task ProcessDocumentTaskAsync(BatchType batchType, FileInfo fileInfo, bool deleteOriginalFile)
        {
            await Task.Run(() =>
            {   
                ProcessParameters processParameters = ProcessParams();/////get process params            
                DocumentProcessor documentProcessor = GetDocumentProcessor(batchType, processParameters);
                using (documentProcessor)
                {
                    documentProcessor.ProcessDocument();
                }
            });
        }

Этот шаблон работает для других задач, и вы можете увидеть из файла журнала, что заданиявыполняется асинхронно.Однако, с этим WinPCLtoPDF.exe, он, кажется, обрабатывает только один файл за раз, однако диспетчер задач показывает, что запущено несколько процессов.Процесс 1 и 2, например, будет ожидать, пока 3 запускается и заканчивается и заменяется на 4, 5 и т. Д., Пока, наконец, вся папка не будет обработана и 1, затем 2 завершена.

Могу ли я узнать, почему 1 & 2похоже блокируются и не завершаются быстро, что позволяет запускать другие задачи?

1 Ответ

0 голосов
/ 27 марта 2019

Возможно, самое простое решение (как упомянуто в комментарии) - использовать Parallel.ForEach. В вашем случае это будет выглядеть примерно так:

        Parallel.ForEach(files, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, fileInfo =>
        {
            ProcessParameters processParameters = ProcessParams();/////get process params            
            DocumentProcessor documentProcessor = GetDocumentProcessor(batchType, processParameters);
            using (documentProcessor)
            {
                documentProcessor.ProcessDocument();
            }
        });

Обратите внимание на ваши попытки:

Причина, по которой он запускает не все Задачи одновременно, возможно, потому, что вы ожидаете завершения Задачи в вашей функции ProcessDocumentTaskAsync.

...