J'ai un processus qui fonctionne en arrière-plan et a WaitForExit (). Puisque la durée peut varier et j'ai besoin d'attendre jusqu'à ce qu'il se termine. Parfois, j'ai besoin de le terminer avant qu'il ne soit terminé et je déclenche la commande. Kill () via un événement de classe. La propriété. HasExited devient true mais le code ne passe jamais la ligne WaitForExit (). Mon processus lance un client de transfert de fichiers basé sur java et effectue un transfert. Le processus apparaît dans le gestionnaire de tâches et Kill () ne le termine pas. Puisque je ne me soucie pas vraiment de mettre fin au processus mais que j'ai besoin de mon programme pour passer à la tâche suivante, j'ai ajouté Close () juste après Kill (). Qui libère le WaitForExit et laisse mon code se déplacer. Terminer le processus tôt sera une occurrence rare dans mon application, mais j'ai encore besoin de travailler, donc cette mise en œuvre devra faire. Demandé Sep 9 13 à 21:15 WaitForExit est un appel direct à l'OS pour attendre que la poignée de processus soit signalée. Quand un processus se termine, WaitForExit se terminera. Kill est un appel direct à TerminateProcess qui est un kill sans poser de questions. S'il est utilisé correctement, WaitForExit retournera après la fin de Kill. Il ya donc un autre bogue dans votre code. Créez une repro simple et vous verrez le problème disparaître. Le bogue est caché dans la complexité de votre code. Ou, WaitForExit est retourné mais vous n'avez pas remarqué. Ou, Kill n'a jamais été exécuté ou a échoué. Encore une fois, la simplification du code révélera le problème. Pouvez-vous l'amener à un repro de 5 lignes je doute que vous pouvez, mais je vais regarder à nouveau si vous le faites. Dans les commentaires que vous avez spécifié que le ping tuer fonctionne, mais de tuer votre processus spécial doesnt. La cause de cela est généralement IO non annulable. Le noyau Windows conserve les processus jusqu'à ce que toutes les E / S soient terminées. Les bonnes nouvelles sont que le processus va mourir finalement et aucun code ne sera exécuté après Kill est retourné. La mauvaise nouvelle est que le nettoyage des ressources n'est pas complètement terminé. Vous devez maintenant vous assurer que votre code peut se déplacer bien que WaitForExit ne soit pas retourné. Pour ce faire, ID a défini ManualResetEvent après la fin de Kill. Et au lieu d'appeler WaitForExit. Vous obtenez le handle de processus à l'aide de la propriété Process. Handle et attendez l'un des deux waitables pour être signalé. Regardez ce que WaitForExit fait en interne pour voir comment vous pouvez implémenter vous-même (copie d'identité de la classe ProcessWaitHandle qui est interne). Une solution plus simple serait d'appeler WaitForExit (TimeSpan. FromMilliseconds (100)) dans une boucle et vérifier l'indicateur quitté chaque fois. Répondre Sep 9 13 at 23: 00Lets lire ce que MSDN dit à ce sujet: La surcharge WaitForExit () () () est utilisée pour faire attendre le thread actuel jusqu'à ce que le processus associé se termine. Cette méthode demande au composant Process d'attendre une quantité infinie de temps pour que le processus quitte. Cela peut provoquer une application pour cesser de répondre. Par exemple, si vous appelez CloseMainWindow pour un processus qui a une interface utilisateur, la demande au système d'exploitation de terminer le processus associé peut ne pas être gérée si le processus est écrit pour ne jamais entrer sa boucle de message. Cette surcharge garantit que tout le traitement est terminé, y compris la gestion des événements asynchrones pour la sortie standard redirigée. Vous devez utiliser cette surcharge après un appel à la surcharge WaitForExit (Int32) lorsque la sortie standard a été redirigée vers les gestionnaires d'événements asynchrones. C'est bien sûr pour. NET. Ce qui vous fait penser qu'il n'attend pas que le processus Note se termine Quels sont les signes de cela Quelle est la preuve Vendredi, 20 Février 2009 20h13 Ne sais pas si cela a changé récemment, mais de retour dans les applications jour sur la fenêtre Mobile n'a jamais vraiment fermé lorsque vous avez frappé le X pour les fermer, ils ne feraient que minimiser et continuer à courir en arrière-plan (ce n'était pas un bug, c'était une fonctionnalité, car la prochaine fois que vous démarrez l'application, il serait démarré très vite, yah Je sais, fou, mais vrai) de sorte que pourrait être pourquoi WaitForExit est peut-être se comporter étrangement et attendre le démarrage de l'application au lieu de la sortie. Mais encore une fois c'est juste la spéculation basée sur le savoir des anciennes versions de Windows Mobile. Vendredi, Février 20, 2009 11:03 PM J'aimerais bump cette question. Im sur Windows Mobile 6 Standard et Im essayant de frayer une instance de navigateur. J'aimerais attendre que l'utilisateur ferme le navigateur. Mais WaitForExit retourne extrêmement rapide. Voici le code: Processus p nouveau Process () p. StartInfo. Arguments quotexample-sitequot p. StartInfo. Verb quotOpenquot p. StartInfo. UseShellExecute faux p. StartInfo. FileName quotIExplore. exequot p. Start () p. WaitForExit () MessageBox. Show (quotNow le navigateur doit être closedquot) Quelle devrait être la bonne façon d'obtenir les résultats attendus lundi, 08 juin 2009 22h45 Où symbole est. symbole. AlexB Tuesday, June 09, 2009 21:58 Im voyant le même problème, mais sur XP. Je pense que la preuve peut être vu dans n'importe quel débogueur (comme je le vois), ou dans n'importe quelle application de console (pas nécessairement sur Mobile), sauf que vous n'avez pas alors obtenir un objet de processus que vous pouvez utilisation. Si vous essayez Dim myProc As New Process () myProc Process. Start (quotiexplorequot, quotfinance. yahooqhpsquot symbole) myProc. WaitForExit () Il retourne toujours immédiatement. Mercredi, 02 septembre 2009 20h48 Le problème est que vous ne démarrez pas une nouvelle instance de iexplore. exe. Vous créez simplement une nouvelle fenêtre sur le processus existant. Ma conjecture est iexplore. exe commence, voit une instance précédente et communique avec l'instance précédente de sorte qu'elle ouvre la nouvelle fenêtre, et alors cette instance que vous avez commencée les sorties immédiatement. Donc, le comportement est correct et à prévoir. Blog. voidnish mercredi, 02 septembre 2009 20:52 Microsoft mène actuellement un sondage en ligne pour comprendre votre opinion sur le site Web Msdn. Si vous choisissez de participer, le sondage en ligne vous sera présenté lorsque vous quitterez le site Web Msdn. Voudriez-vous participer
No comments:
Post a Comment