Lorsque j'obtiens une référence à un System.Diagnostics.Process
, comment puis-je savoir si un processus est en cours d'exécution?
155
C'est une façon de le faire avec le nom:
Process[] pname = Process.GetProcessesByName("notepad");
if (pname.Length == 0)
MessageBox.Show("nothing");
else
MessageBox.Show("run");
Vous pouvez boucler tous les processus pour obtenir l'ID pour une manipulation ultérieure:
Process[] processlist = Process.GetProcesses();
foreach(Process theprocess in processlist){
Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, theprocess.Id);
}
if/else
qui ne font qu'une seule ligne n'ont pas besoin d'accolades pour indiquer l'instruction de bloc. Cela vaut aussi pourforeach
etfor
déclarations. Cela se résume au style de codage.for
informations. Des années de développement c # .net et je n'ai jamais vu ce style. Comme on dit, "vous apprenez quelque chose de nouveau chaque jour". Merci pour le message et la réponse ..C'est le moyen le plus simple que j'ai trouvé après avoir utilisé un réflecteur. J'ai créé une méthode d'extension pour cela:
La
Process.GetProcessById(processId)
méthode appelle laProcessManager.IsProcessRunning(processId)
méthode et lanceArgumentException
au cas où le processus n'existe pas. Pour une raison quelconque, laProcessManager
classe est interne ...la source
Solution synchrone:
Solution asynchrone:
la source
reshefm a eu une assez bonne réponse; cependant, il ne tient pas compte d'une situation dans laquelle le processus n'a jamais commencé.
Voici une version modifiée de ce qu'il a publié.
J'ai supprimé son ArgumentNullException parce qu'il suppose en fait être une exception de référence nulle et qu'il est de toute façon levé par le système et j'ai également pris en compte la situation dans laquelle le processus n'a jamais commencé ou la méthode close () a été utilisée pour fermer le processus.
la source
Cela devrait être une seule ligne:
la source
Cela dépend de la fiabilité de cette fonction. Si vous voulez savoir si l'instance de processus particulière que vous avez est toujours en cours d'exécution et disponible avec une précision de 100%, vous n'avez pas de chance. La raison en est qu'à partir de l'objet de processus géré, il n'y a que 2 façons d'identifier le processus.
Le premier est l'ID de processus. Malheureusement, les identifiants de processus ne sont pas uniques et peuvent être recyclés. La recherche d'un identifiant correspondant dans la liste des processus vous indiquera uniquement qu'un processus avec le même identifiant est en cours d'exécution, mais ce n'est pas nécessairement votre processus.
Le deuxième élément est le descripteur de processus. Il a le même problème que l'Id et il est plus difficile de travailler avec.
Si vous recherchez une fiabilité de niveau moyen, il suffit de vérifier la liste de processus actuelle pour un processus du même ID.
la source
Process.GetProcesses()
est la voie à suivre. Mais vous devrez peut-être utiliser un ou plusieurs critères différents pour trouver votre processus, en fonction de la façon dont il s'exécute (c'est-à-dire en tant que service ou application normale, qu'il ait ou non une barre de titre).la source
Peut-être (probablement) que je lis mal la question, mais recherchez-vous la propriété HasExited qui vous dira que le processus représenté par votre objet Process s'est terminé (normalement ou non).
Si le processus auquel vous faites référence possède une interface utilisateur, vous pouvez utiliser la propriété Responding pour déterminer si l'interface utilisateur répond actuellement à l'entrée utilisateur ou non.
Vous pouvez également définir EnableRaisingEvents et gérer l'événement Exited (qui est envoyé de manière asynchrone) ou appeler WaitForExit () si vous souhaitez bloquer.
la source
Vous pouvez instancier une instance de processus une fois pour le processus souhaité et continuer à suivre le processus à l'aide de cet objet Process .NET (il continuera à suivre jusqu'à ce que vous appeliez explicitement Close sur cet objet .NET, même si le processus qu'il suivait est mort [ceci afin de pouvoir vous donner l'heure de la fermeture du processus, aka ExitTime etc.])
Citant http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx :
la source
J'ai essayé la solution de Coincoin:
avant de traiter un fichier, je le copie en tant que fichier temporaire et l'ouvre.
Quand j'ai terminé, je ferme l'application si elle est toujours ouverte et
je supprime le fichier temporaire: j'utilise juste une variable Process et je la vérifie ensuite:
Plus tard, je ferme l'application:
Cela fonctionne (jusqu'à présent)
la source
openApplication.HasExited()
, HasExited n'est pas une fonction. La bonne façon seraitopenApplication.HasExited
.Malgré l'API prise en charge par les frameworks .Net concernant la vérification des processus existants par ID de processus, ces fonctions sont très lentes. Il en coûte énormément de cycles CPU pour exécuter Process.GetProcesses () ou Process.GetProcessById / Name ().
Une méthode beaucoup plus rapide pour vérifier un processus en cours par ID consiste à utiliser l'API native OpenProcess () . Si le handle de retour est 0, le processus n'existe pas. Si le handle est différent de 0, le processus est en cours d'exécution. Il n'y a aucune garantie que cette méthode fonctionnera à 100% à tout moment grâce à l'autorisation.
la source
Il existe de nombreux problèmes associés à cela, car d'autres semblent partiellement résoudre:
Que les propriétés que d'autres ont mentionnées soient internes ou non, vous pouvez toujours obtenir des informations de leur part par réflexion si l'autorisation le permet.
Vous pouvez épingler du code Win32 pour Snapshot ou vous pouvez utiliser WMI qui est plus lent.
Une autre option serait OpenProcess / CloseProcess, mais vous rencontrerez toujours les mêmes problèmes avec les exceptions levées comme avant.
Pour WMI - OnNewEvent.Properties ["?"]:
la source
vous pouvez également utiliser une minuterie pour vérifier le processus à chaque fois
la source
length == 0
devrait s'afficherNot Working
), mais le travail est toujours terminé.