Pregunta

Tengo un ejecutable de línea de comandos que se ejecuta desde una biblioteca de clase C #. En algunas situaciones muy raras, el ejecutable se bloqueará debido a los datos de la línea de comando que se le pasan. Desafortunadamente, esto hace que la aplicación que llama a la DLL de c # se cuelgue mientras espera indefinidamente a que el proceso salga.

Si la línea de comando exe no termina la ejecución dentro de 1 segundo, nunca va a salir. Lo que me gustaría hacer es generar un temporizador justo después de que el proceso haya comenzado y forzar el cierre del proceso si no ha salido en unos segundos.

¿Cuál es el mejor enfoque aquí? La solución debe tener un impacto mínimo en el rendimiento porque este proceso de línea de comandos es el cuello de botella en una tarea altamente repetitiva.

Editar: ¿Alguna razón por la que debería usar System.Timer en lugar de Threading.Timer o viceversa?

            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.CreateNoWindow = false;
            startInfo.UseShellExecute = true;
            startInfo.WorkingDirectory = workingDirectory;
            startInfo.FileName = commandLineExe;
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            startInfo.Arguments = strArguments;



            // Call WaitForExit and then the using statement will close.
            using (Process exeProcess = Process.Start(startInfo))
            {

                exeProcess.WaitForExit();
            }

Por favor, evite las sugerencias de que debería intentar averiguar por qué la aplicación de línea de comando se está bloqueando, o que debería refactorizar la funcionalidad de la línea de comando en el código fuente. Estamos trabajando activamente en ese problema, pero la estabilidad de la aplicación debe ser lo primero.

¿Fue útil?

Solución

Solo agrega:

// Call WaitForExit and then the using statement will close.
using (Process exeProcess = Process.Start(startInfo)) {
    if(!exeProcess.WaitForExit(1000))
          exeProcess.Kill();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top