es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

WaitForExitAsync con un tiempo de espera

Entonces noté que hay un método llamado WaitForExit que acepta un entero como argumento (milisegundos), por lo que si el proceso no puede salir por sí mismo, simplemente lo maté después de unos segundos.

Algo así.

if (!CMD.WaitForExit(3000))
    CMD.Kill();

El problema es que mientras tanto me gustaría guardar la salida, así que noté que hay un método asincrónico WaitForExitAsync, pero este no acepta estos milisegundos.

// Esperar a la salida de forma asíncrona...
// Mientras tanto, guardar la salida hasta que se mate a sí mismo.

while (CMD.StandardOutput.ReadLine() != null) 
    standard_output = StandardOutput.ReadLine();

¿Alguna idea de cómo hacer esto? ¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto sería iniciar un temporizador antes de llamar a WaitForExitAsync y luego leer la salida del proceso en un hilo separado. Una vez que el temporizador expire o el proceso salga, el hilo puede dejar de leer la salida y devolverla.

    Aquí hay un ejemplo de código:

    int timeout = 3000; // tiempo de espera en milisegundos
    string standard_output = "";
    
    // Iniciar temporizador
    var timer = new System.Timers.Timer(timeout);
    timer.Elapsed += (sender, args) => CMD.Kill();
    
    // Iniciar lectura de salida en un hilo separado
    var outputThread = new Thread(() =>
    {
        while (true)
        {
            string line = CMD.StandardOutput.ReadLine();
            if (line == null)
                break;
            standard_output += line + "\n";
        }
    });
    
    // Iniciar proceso y hilo de salida
    CMD.Start();
    outputThread.Start();
    
    // Esperar a que el proceso salga
    await CMD.WaitForExitAsync();
    
    // Detener temporizador y hilo de salida
    timer.Stop();
    outputThread.Join();
    
    // Devolver salida
    return standard_output;
    

    Este código inicia un temporizador que matará al proceso después del período de tiempo especificado. Luego, inicia un hilo separado para leer la salida del proceso hasta que este termine. Una vez que el proceso finalice, se detienen el temporizador y el hilo de salida, y se devuelve la salida.

Comments are closed.