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.

C# haz algo si el proceso lleva más tiempo del intervalo de tiempo establecido, pero no lo detengas.

Tengo un proceso .exe al que quiero esperar 2 horas para que termine. Pero si tarda más de 1 hora, me gustaría llamar a una función para enviar un correo electrónico indicando que está tardando más de lo habitual. ¿Cómo puedo llamar a una función si lleva más tiempo del establecido pero sin cerrar el proceso y aún así esperar las 2 horas completas?

Cómo estoy llamando al proceso:

var proc = System.Diagnostics.Process.Start(exePath, parameterString);
var procExited = proc.WaitForExit(doshorasenmilisegundos);
// ¿qué hacer aquí si tarda más de 1 hora pero sin cerrarlo?
int exitCode = proc.ExitCode;
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es utilizando un temporizador para rastrear el tiempo de ejecución del proceso y un indicador para indicar si se ha enviado el estado del correo electrónico.

    Aquí tienes un ejemplo de implementación:

    var proc = System.Diagnostics.Process.Start(rutaArchivoEjecutable, cadenaParametros);
    
    var temporizadorEjecucion = new System.Timers.Timer { Interval = 3600000 }; // configurar el temporizador a 1 hora
    var correoEnviado = false; // indicador para rastrear si se ha enviado el estado del correo electrónico
    
    temporizadorEjecucion.Elapsed += (sender, e) =>
    {
        if (!proc.HasExited && !correoEnviado) // si el proceso aún se está ejecutando y el correo aún no se ha enviado
        {
            // enviar el estado del correo electrónico aquí
            correoEnviado = true; // establecer el indicador en verdadero para indicar que se ha enviado el correo electrónico
        }
    };
    
    temporizadorEjecucion.Start();
    
    var procFinalizado = proc.WaitForExit(7200000); // esperar el tiempo completo de 2 horas
    
    temporizadorEjecucion.Stop(); // detener el temporizador
    
    if (!correoEnviado && !proc.HasExited) // si el estado del correo electrónico aún no se ha enviado y el proceso aún se está ejecutando
    {
        // enviar el estado del correo electrónico aquí
    }
    
    int codigoSalida = proc.ExitCode;
    

    Explicación:

    • Creamos una instancia de temporizador con un intervalo de 1 hora (3600000 milisegundos).
    • Creamos un indicador correoEnviado para rastrear si se ha enviado el estado del correo electrónico. Inicialmente establecido en falso.
    • Adjuntamos un controlador de eventos al evento Elapsed del temporizador. Dentro del controlador, verificamos si el proceso aún se está ejecutando y el estado del correo electrónico aún no se ha enviado. Si es así, enviamos el estado del correo electrónico y establecemos el indicador en verdadero.
    • Iniciamos el temporizador.
    • Llamamos a WaitForExit en el proceso, pasando las 2 horas completas (7200000 milisegundos).
    • Después de que el proceso haya finalizado (o hayan transcurrido las 2 horas), detenemos el temporizador.
    • Finalmente, verificamos si el estado del correo electrónico aún no se ha enviado y el proceso aún se está ejecutando. Si es así, enviamos el estado del correo electrónico.

Comments are closed.