puede utilizar la memoria compartida para que los 2 procesos se comuniquen, consulte MemoryMappedFile
creará principalmente un archivo mapeado de memoria mmf
en el proceso principal usando la instrucción "using" y luego creará el segundo proceso hasta que finalice y dejará que escriba el resultado en mmf
usando BinaryWriter
, luego lea el resultado del mmf
usando el padre proceso, también puede pasar el nombre mmf
utilizando argumentos de línea de comandos o codificarlo con código.
asegúrese de que cuando se utiliza el archivo asignado en el proceso principal que realice el proceso hijo que escriba el resultado al archivo asignado antes de que el archivo de mapeado se libera en el proceso padre
Ejemplo: proceso de padres
private static void Main(string[] args)
{
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("memfile", 128))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(512);
}
Console.WriteLine("Starting the child process");
// Command line args are separated by a space
Process p = Process.Start("ChildProcess.exe", "memfile");
Console.WriteLine("Waiting child to die");
p.WaitForExit();
Console.WriteLine("Child died");
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryReader reader = new BinaryReader(stream);
Console.WriteLine("Result:" + reader.ReadInt32());
}
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
proceso niño
private static void Main(string[] args)
{
Console.WriteLine("Child process started");
string mmfName = args[0];
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting(mmfName))
{
int readValue;
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryReader reader = new BinaryReader(stream);
Console.WriteLine("child reading: " + (readValue = reader.ReadInt32()));
}
using (MemoryMappedViewStream input = mmf.CreateViewStream())
{
BinaryWriter writer = new BinaryWriter(input);
writer.Write(readValue * 2);
}
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
para utilizar este ejemplo, tendrá que crear una solución con 2 proyectos en lado, entonces se toma el resultado de la acumulación del proceso hijo de% childDir%/bin/debug y copiarlo% ParentDirectory%/bin/debug continuación, ejecutar el proyecto principal
childDir
y parentDirectory
son los nombres de las carpetas de sus proyectos en la pc buena suerte :)
me preguntaba cómo se puede tratar con StandardError?. Por cierto, realmente me gusta este fragmento de código! bonito y limpio. – codea
@codea - leer de 'proc.StandardError'. – Ferruccio
Gracias, pero creo que no estaba claro: ¿debería agregar otro ciclo para hacerlo? – codea