Если допустимо запускать дочерний процесс непосредственно из родительского процесса (UseShellExecute
= false
), то вы можете перенаправить StandardInput
дочернего процесса и передать произвольный размер данных, выбросив его,Вот пример передачи массива из 100000 строк и прочего, сериализации в двоичном формате.
static void Main(string[] args)
{
if (args.Length == 0)
{
var exeFilePath = Assembly.GetExecutingAssembly().Location;
var psi = new ProcessStartInfo(exeFilePath, "CHILD");
psi.UseShellExecute = false;
psi.RedirectStandardInput = true;
Console.WriteLine("Parent - Starting child process");
var childProcess = Process.Start(psi);
var bf = new BinaryFormatter();
object[] data = Enumerable.Range(1, 100000)
.Select(i => (object)$"String-{i}")
.Append(13)
.Append(DateTime.Now)
.Append(new DataTable("Customers"))
.ToArray();
Console.WriteLine("Parent - Sending data");
bf.Serialize(childProcess.StandardInput.BaseStream, data);
Console.WriteLine("Parent - WaitForExit");
childProcess.WaitForExit();
Console.WriteLine("Parent - Closing");
}
else
{
Console.WriteLine("Child - Started");
var bf = new BinaryFormatter();
Console.WriteLine("Child - Reading data");
var data = (object[])bf.Deserialize(Console.OpenStandardInput());
Console.WriteLine($"Child - Data.Length: {data.Length}");
Console.WriteLine("Child - Closing");
}
}
Вывод:
Parent - Запуск дочернего процесса
Child -Запущено
Child - чтение данных
Parent - Отправка данных
Parent - WaitForExit
Child - Data.Length: 100003
Child - Закрытие
Parent - Закрытие
Этот пример выполняется на моей машине за 6 секунд.