Estoy tratando de pasar información desde un proceso hijo, que es un pipe, a su proceso padre que es solo un formulario en este momento. He logrado que mis named pipes funcionen entre sí cuando son independientes y no son procesos hijo, sin embargo, cuando intento usar el pipeServer como un proceso hijo, este (el proceso child pipeserver) se inicia y luego se cierra y no puedo entender por qué. Tampoco está produciendo ninguna salida a pesar de que la tengo redirigida a mi depuración.
Mi servidor de pipes debería cerrarse después de recibir 3 mensajes del pipeClient. Actualmente, parece que se inicia ya que se llama y luego se cierra automáticamente un par de segundos después cuando debería estar esperando para recibir un mensaje del cliente de pipe.
Cualquier ayuda/dirección es apreciada.
aquí está mi código:
Desde el formulario que llama al proceso
private void pipeB_Button_Click(object sender, EventArgs e)
{
using (Process process = new Process())
{
process.StartInfo.FileName = @"\\Mac\Home\Desktop\myPathName\TestNamedPipeB\TestNamedPipeB\bin\Debug\TestNamedPipeB.exe";
process.StartInfo.UseShellExecute = false; // necesario de alguna manera
//process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.Start(); // aquí es donde se inicia y se cierra.
process.WaitForExit();
StreamReader reader = process.StandardOutput;
string s = process.StandardOutput.ReadToEnd();
Debug.WriteLine("s: " + s);
string output = reader.ReadToEnd(); // utilizado
pipeConversation.Append(output);
Debug.WriteLine("pipeConversation: " + pipeConversation.ToString());
}
}
mi código de servidor de pipes
namespace TestNamedPipeB
{
class Program
{
static void Main(string[] args)
{
Console.SetWindowSize(100, 15);
StartServer();
}
static void StartServer()
{
var server = new NamedPipeServerStream("test-pipe");
if (server.IsConnected == false)
{
Console.WriteLine("Actualmente esperando a que un cliente se conecte...");
}
server.WaitForConnection();
StreamReader reader = new StreamReader(server);
StreamWriter writer = new StreamWriter(server);
Console.Write("Un cliente se ha conectado, esperando saludo del cliente... \n");
string emptyArgsString = "PipeA envió un mensaje vacío. PipeB (este programa) está asumiendo que pipeA no tiene argumentos y se está cerrando";
int readerCounter = 0;
int readerMaxInt = 3; // edítame a un int mayor que 1 si quieres probar
while (readerCounter < readerMaxInt)
{
var line = reader.ReadLine();
if (line == null)
{
Console.WriteLine(emptyArgsString);
Debug.WriteLine(emptyArgsString);
MessageBox.Show(emptyArgsString, "M3dida", MessageBoxButtons.OK, MessageBoxIcon.Information);
break;
}
Console.WriteLine("PipeA dijo: " + line);
Debug.WriteLine("PipeA dijo: " + line);
readerCounter++;
if (readerMaxInt > 1)
{
writer.WriteLine(Console.ReadLine()); //<-- necesario para enviar una respuesta de vuelta si se envían varios mensajes
writer.Flush(); // cambios a otro pipe
}
}
}
}
}