2009-12-04 5 views
0

Je lance un fichier batch à partir de mon application C# via la classe Process. Ce fichier a démarré l'application Java. Je ne peux pas reconnaître quel processus appelé java.exe doit être kill pour arrêter cette application. Y at-il un moyen plus élégant que de les tuer tous, j'espère que je mets fin à la bonne et ne pas tuer une autre application Java importante? Merci pour toute aide que j'ai vraiment trouvée là-bas.kill processus java.exe

Cheers, Andrew

+0

Il doit exister une relation parent-enfant gérée par OS entre Java.app et l'application C#. Je suppose que vous êtes sur Windows? Et pourquoi voulez-vous tuer ce processus Java? –

+0

Oui Iam sur les fenêtres. Le processus Java est lancé par l'utilisateur à partir de mon application C#. Il fait des calculs pour lui. Si l'utilisateur décide d'arrêter le calcul, je dois tuer l'application java, car elle traite énormément de données et est donc coûteuse en temps. Merci. J'ai trouvé un certain maintien de la relation parent-enfant, je vais le tester. – Andrew

Répondre

2

EDIT: J'ai raté la partie de fichier batch. Cette réponse ne sera utile que si vous pouvez lancer le processus directement à partir de C# ...

Lorsque vous démarrez le processus, vous pouvez stocker l'ID de processus afin de pouvoir le récupérer plus tard et le supprimer.

Process p = new Process(); 
//set all the process start Info... 
p.Start(); 

someVariableICanGetToLater = p.Id 

//Later when you need to kill the process... 
Process pToKill = Process.GetProcessById(someVariableICanGetToLater); 
pToKill.Kill(); 
+0

Il semble qu'il ne sait pas que le processus Java est en cours de démarrage, donc je doute qu'il sache où est le code, ou peut-être que la source n'est pas disponible. –

0

Je suppose que, depuis le fichier batch lance l'application Java, sachant l'ID du processus de fichier batch ne sera pas utile.

Process.GetProcessesByName("java") vous donne une liste de toutes les instances de java.exe.

+0

plus il doit interroger la relation parent-enfant entre l'application C# et les processus Java. Pourriez-vous poster ce code? : P –

0

pseudo-code. Remplissez OS appels spécifiques ici:

int cs_pid=getProcessByName("CSharpAppName"); 
int javaPid[]= getProcessByName("JavaAppName"); 

bool javaToCSharpRelationship[]=new bool[javaPid.size]; 

int loopCounter=0; 

forEach int in javaPid 
begin 
     if(isChildOf(cs_pid,java_pid)) 
     begin 
     // OS call or Wrapper to determine relationship between c# pid 
     // and Java app PID 
     javaToCSharpRelationShip[loopCounter]=true; 
     //can call kill here if you like 
     end 
     else 
     javaToCSharpRelationShip[loopCounter]=false; 
    loopCounter++; 
end 

A la fin de ce code, vous devriez avoir un tableau de ce PID qui sont des enfants de l'application C#.

+0

Salut, ça a l'air vraiment intéressant. Pouvez-vous me donner un indice sur la méthode isChildOf? – Andrew

0

À moins que le fichier batch fait beaucoup de choses, difficile à accomplir en utilisant uniquement des classes de .NET Process et ProcessStartInfo, une autre option serait de commencer directement java.exe et contrôler les arguments et les variables d'environnement via Arguments et EnvironmentVariables propriétés de ProcessStartInfo . Ensuite, vous pourriez utiliser l'approche de Jason pour stocker l'identifiant du processus java.exe afin de le tuer plus tard.