2017-09-05 1 views
1

J'ai deux programmes en conflit les uns avec les autres. L'un d'entre eux est une application de console C# qui est lancée par le planificateur de tâches (Program1) au milieu de la nuit, l'autre (Program2) est un programme C# WPF qui est généralement exécuté par les utilisateurs pendant la journée. J'ai essayé d'utiliser ce qui suit pour fermer Programme2 de Program1:Comment trouvez-vous/fermez-vous lors de l'exécution de TaskScheduler?

public static void CloseProgram2() 
{ 
    var process = System.Diagnostics.Process.GetProcessesByName("Program2").FirstOrDefault(); 
    if (process != null) 
    { 
     if (process.CloseMainWindow()) 
     { 
      SpinWait.SpinUntil(() => null == System.Diagnostics.Process.GetProcessesByName("Program2").FirstOrDefault(), 
       TimeSpan.FromSeconds(30)); 
     } 
    } 
} 

Pour une raison quelconque, Programme2 ne se ferme pas lorsque Program1 est exécuté à partir du TaskScheduler. Cependant, si j'exécute Program1 manuellement, il arrête toujours Program2. J'ai planificateur de tâches défini pour fournir des informations d'identification de sorte que Programme1 s'exécutera si quelqu'un est connecté ou non à l'ordinateur. Je remarque que la fenêtre de sortie de Program1 n'est pas affichée alors qu'elle s'exécute à partir du planificateur de tâches, mais qu'elle s'exécute correctement. Je me demande si Task Scheduler exécute Program1 de telle sorte qu'il ne voit pas les processus qui n'ont pas été démarrés par Task Scheduler, et c'est pourquoi Program2 ne se ferme pas.

Toutes les idées ou solutions qui peuvent m'aider à fermer Program2 de Program1 lorsque Program1 est exécuté à l'aide de TaskScheduler seraient grandement appréciées.

+0

Il n'est pas possible de répondre à votre question sans un bon [mcve] qui reproduit fidèlement le problème. Cela inclurait des détails sur l'exécution de votre tâche de planificateur de tâches (de préférence _code_ qui installe la tâche). Mais il semble presque certain que le problème est lié au compte d'utilisateur sous lequel le programme de la console est exécuté et aux processus que ce programme peut voir et/ou terminer. –

+0

Vous pouvez déboguer ceci plus efficacement si vous ajoutez la journalisation à la console et aux programmes WPF, afin que chacun puisse rapporter des choses pertinentes à son fonctionnement (quels processus sont retournés, si un message 'WM_CLOSE' est reçu, etc.) –

Répondre

0

J'ai trouvé une autre solution à utiliser. Au lieu d'utiliser proccess.CloseMainWindow() J'ai créé un fichier de commandes avec les éléments suivants:

taskkill /F /IM Program2.exe 

Et puis juste couru ce fichier de commandes à partir du Planificateur de tâches.

Ce qui est bizarre, c'est que je devais mettre une ligne vide avant la commande taskkill dans mon fichier bat. Sans cela, je reçois un tas de charabia et il dit qu'il ne sait pas comment exécuter cette commande. Presque comme si les déchets étaient insérés avant la commande taskkill. Très étrange ...