2015-05-13 7 views
2

Следующий код, который я собираюсь опубликовать, отлично работает, однако мне нужно иметь возможность запускать несколько процессов одновременно.Выполнение нескольких процессов

Итак, чтобы получить некоторый фон, список содержит файлы, которые будут запускаться через другой процесс для создания файлов PDF (по существу передавая аргументы другому процессу, который является exe, указанным в StartInfo.Filename). Что в настоящее время происходит, скажем, listbox содержит 10 файлов. Каждый файл будет обрабатываться отдельно до обработки дополнительных файлов. Я хотел бы иметь возможность запускать все 10 файлов одновременно, а не ждать. Некоторые файлы могут занимать больше времени, чем другие, поэтому я теряю время, ожидая завершения каждого файла.

Предложения?

  Dim UPSFiles = (From i In ListBoxUPSFiles.Items).ToArray() 
     For Each Item In UPSFiles 
      Dim UPSFiles2 = Item.ToString 
      Using psinfo As New Process 
       psinfo.StartInfo.FileName = "\\dgrvdp1\ClientServices\APPS\Printtrack\HeliosPNetExecuter\HeliosPNetExecuter.exe " 
       psinfo.StartInfo.Arguments = Arg2 + Arg3 + Arg4 + (Chr(34) + DATA_PATH + "\" + UPSFiles2 + Chr(34) + " ") + Arg6 + Arg7 + Arg8 + Arg9a + Arg10 + Arg11 + Arg13 
       psinfo.StartInfo.WindowStyle = ProcessWindowStyle.Hidden 
       psinfo.Start() 
       'psinfo.WaitForExit() 
      End Using 
     Next 

EDIT Вот мой текущий код, основанный на Parallel.ForEach предложение. Кажется, что это сработало, но представило 10x количество файлов, которые мне нужно запустить. В моем случае у меня есть два файла для обработки, но, как я уже упоминал, код дал 10x количество процессов, которые мне действительно нужны.

  Dim SequentialFiles = (From i In ListBoxSequentialFiles.Items).ToString 
     For Each Item In SequentialFiles 
      Dim SequentialFiles2 = Item.ToString 

      Parallel.ForEach(SequentialFiles2, Sub(processFiles) 

                Using psinfo As New Process 
                 psinfo.StartInfo.FileName = "\\dgrvdp1\ClientServices\APPS\Printtrack\HeliosPNetExecuter\HeliosPNetExecuter.exe " 
                 psinfo.StartInfo.Arguments = Arg2 + Arg3 + Arg4 + (Chr(34) + DATA_PATH + "\" + SequentialFiles2 + Chr(34) + " ") + Arg6 + Arg7 + Arg8 + Arg9c + Arg10 + Arg11 + Arg12 
                 psinfo.StartInfo.WindowStyle = ProcessWindowStyle.Normal 
                 psinfo.Start() 
                 psinfo.WaitForExit() 
                End Using 

               End Sub) 

     Next 
+2

[Parallel.ForEach] (https://msdn.microsoft.com/en-us/library/dd460720 (v = vs.110) .aspx? Cs-save-lang = 1 & cs-lang = vb # code- фрагмент-1)? – crashmstr

+1

Один из способов сделать это - создать обработчик фона для обработки каждого элемента или использовать ThreadPool.QueueUserWorkItem. В любом случае будет создан новый поток для обработки каждого элемента. –

+0

@crashmstr Я, должно быть, потерпел неудачу в попытке использовать ваше предложение. Он, похоже, работал, однако код, который я отправляю, дал 10x количество файлов, которые я отправил, в моем случае у меня есть два файла для запуска в одно и то же время. – Muhnamana

ответ

0

Зависит от работы процессора PDF. Вы можете избежать потоков creting, но просто запустите 10 процессов, загрузив один файл за процесс. Нет необходимости многопоточности, на этом этапе, по крайней мере.

+0

Я думал, что «Для каждого» это сделает, подавая один файл вовремя. Прямо сейчас, он ждет, пока первый файл не будет обработан, прежде чем начинать все оставшиеся процессы. Мне просто нелегко запускать несколько процессов на основе элементов в моем списке. – Muhnamana

+0

Да, вы можете запускать все процессы и собирать их в коллекции. После того, как обработайте его в отдельности. Я хочу сказать, вам не нужно 'Parallel.ForEach', * для этого *. – Tigran

+0

Предложения о том, как собирать процессы? Как я уже сказал, мое текущее заявление для каждого из них, как я думал, обработало бы это, перебирая каждый файл в списке и начиная процесс. – Muhnamana

Смежные вопросы