2015-05-05 4 views
0

Мне нужно выполнить внешнюю программу с аргументами и получить от нее результат (~ 1000 раз с разными аргументами). я нашел решение, как это:загрузить и выполнить внешнюю программу (много раз)

using System.Diagnostics; 
... 
Process process = new Process(); 
// Configure the process using the StartInfo properties. 
process.StartInfo.FileName = "process.exe"; 
process.StartInfo.Arguments = "qwe 123"; 
process.Start(); 
process.WaitForExit();// Waits here for the process to exit. 
// And check exit code for result 

мне нужно много повторений с разными аргументами, но этот код каждый раз, когда начать новый процесс. Это очень дорогостоящая операция. Я думаю, я могу «загрузить» («сохранить») процесс и повторить его без всякого запуска. Или, может быть, существует другой способ решить эту проблему?

+0

Это почти полностью зависит от процесса, с которого вы начинаете. Ваше решение начинается там. Если этот процесс не предоставляет вам средства для изменения этих аргументов во время выполнения, у вас, вероятно, нет другого выбора, кроме как перезапустить весь процесс каждый раз. – pyrocumulus

+0

@pyrocumulus, вы имеете в виду, что я могу сделать свою программу процесса так, чтобы она могла принимать и возвращать некоторые значения без ее окончания? – Yuri

+0

@pyrocumulus, если это возможно, я могу изменить свою программу процесса, как я хочу – Yuri

ответ

0

Если начальный процесс находится под вашим контролем, будет гораздо эффективнее передавать входные данные не через параметр командной строки для нового экземпляра процесса каждый раз, а повторно запрограммировать его так, чтобы процесс считывал стандартную строку ввода- мудрый в цикле, обрабатывает каждую строку и записывает результат в свой стандартный вывод. Это легко подключить вызывающую программу к процессу ввода и вывода:

// ... 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.RedirectStandardInput = true; 
// ... 
process.Start(); 

StreamReader results = process.StandardOutput; 
StreamWriter processInput = process.StandardInput; 

foreach(var arg in args) 
{ 
    processInput.WriteLine(arg); 
    var oneResult = results.ReadLine(); 
    // do something with this oneResult 
} 

В этом примере предполагается, что каждый аргумент помещается в одной строке (и каждый результат помещается в строке, тоже). Написание и чтение одной строки каждый раз является нашим простым «протоколом», чтобы узнать, когда начать обработку (со стороны процесса) и когда результат будет завершен (со стороны C#).

Возможно, я должен добавить, что настоящая программа должна добавлять обработку ошибок и, например, оцените возвращаемое значение Process.Start().