Question

J'ai un exécutable en ligne de commande qui est exécuté à partir d'une bibliothèque de classes C #. Dans de très rares cas, l'exécutable se bloque en raison des données de ligne de commande qui lui ont été transmises. Malheureusement, l'application qui appelle la DLL c # se bloque pendant qu'elle attend indéfiniment la fin du processus.

Si l'exe de ligne de commande ne termine pas l'exécution en 1 seconde, il ne va jamais se quitter. Ce que je voudrais faire, c'est créer une minuterie juste après le début du processus et forcer la fermeture du processus s'il ne s'est pas terminé en quelques secondes.

Quelle est la meilleure approche ici? La solution doit avoir un impact minimal sur les performances car ce processus de ligne de commande constitue le goulot d'étranglement d'une tâche hautement répétitive.

Modifier: une raison quelconque pour laquelle je devrais utiliser System.Timer plutôt que Threading.Timer ou vice versa?

            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();
            }

Veuillez vous abstenir de suggérer que je devrais essayer de comprendre pourquoi l'application en ligne de commande est suspendue ou que je devrais refactoriser la fonctionnalité de ligne de commande dans le code source. Nous travaillons activement sur ce problème, mais la stabilité de l'application doit être une priorité.

Était-ce utile?

La solution

Ajoutez simplement:

// Call WaitForExit and then the using statement will close.
using (Process exeProcess = Process.Start(startInfo)) {
    if(!exeProcess.WaitForExit(1000))
          exeProcess.Kill();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top