Следующий код, который я собираюсь опубликовать, отлично работает, однако мне нужно иметь возможность запускать несколько процессов одновременно.Выполнение нескольких процессов
Итак, чтобы получить некоторый фон, список содержит файлы, которые будут запускаться через другой процесс для создания файлов 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
[Parallel.ForEach] (https://msdn.microsoft.com/en-us/library/dd460720 (v = vs.110) .aspx? Cs-save-lang = 1 & cs-lang = vb # code- фрагмент-1)? – crashmstr
Один из способов сделать это - создать обработчик фона для обработки каждого элемента или использовать ThreadPool.QueueUserWorkItem. В любом случае будет создан новый поток для обработки каждого элемента. –
@crashmstr Я, должно быть, потерпел неудачу в попытке использовать ваше предложение. Он, похоже, работал, однако код, который я отправляю, дал 10x количество файлов, которые я отправил, в моем случае у меня есть два файла для запуска в одно и то же время. – Muhnamana