1 votos

C# - ¿Por qué se cierra automáticamente mi tubería de proceso secundario?

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
                }
            }
        }
    }
}

0voto

Cflux Puntos 835

Este es probablemente el peor error con el que me he encontrado y es tan increíblemente sucio que hace que un clavo oxidado parezca limpio. Además, no soy un programador formalmente entrenado, así que eso hay que tenerlo en cuenta.

esta línea: Console.SetWindowSize(100, 15); estaba causando el error. Una vez que la eliminé del proceso secundario, todo volvió a funcionar. No tengo ni idea de por qué.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X