J'écris un programme C# qui lancera de nombreux processus enfants. À un moment ultérieur, j'aurai besoin de récupérer ces processus par ID et de faire correspondre ces processus à un ensemble de processus stockés dans un dictionnaire qui ont été ajoutés au dictionnaire lors de leur création initiale. Cependant, je suis en cours d'exécution dans un problème qui semble être pur ... ridiculeFrustration .NET - Process.GetProcessById renvoie une nouvelle référence
Process notepad = new Process();
notepad.StartInfo.FileName = "notepad";
notepad.Start();
Process n2 = Process.GetProcessById(notepad.Id);
Debug.WriteLine(notepad == n2); //'False', but Why isn't this true???
Debug.WriteLine(notepad.Id == n2.Id); //'True'
Je l'ai utilisé réflecteur .NET pour savoir que GetProcessById retourne un « nouveau processus (...) », mais semble devoir juste trouver une référence au processus déjà en cours et le renvoyer à la place.
Vous pouvez supposer la première instruction de débogage est essentiellement un appel comme
données MyCustomDataType = MyDictionary [bloc-notes];
Je m'attendrais à obtenir les données que j'ai insérées à l'origine, à la place je reçois une KeyNotFoundException probablement parce que le comparateur par défaut effectue une vérification de référence. Pour contrer cela, j'ai ajouté un IComparer personnalisé sur mon dictionnaire qui vérifie juste que les deux objets Process ont le même ID, donc je peux obtenir les données associées comme prévu. Cependant, cela a son propre problème en ce que les processus qui ne sont pas en cours d'exécution n'ont pas d'ID de processus, donc parfois l'appel dans mon IComparer personnalisé à Process.ID lève une exception InvalidOperationException !!! Donc, j'ai résolu un problème seulement pour en créer un autre.
Donc, je suppose que j'ai deux questions:
- Pourquoi ne retourne .NET pas seulement une référence à une instance de processus déjà en cours?
- Que puis-je faire pour faire correspondre les processus stockés dans mon dictionnaire, car l'ID de processus n'est pas toujours valide pour la durée de vie de l'objet Processus?
Bonjour Franci. Merci beaucoup pour votre explication claire. Que recommanderiez-vous pour «utiliser comme clé quelque chose qui représente l'identité du processus à la place»? Je ne peux pas vraiment penser à une propriété en construction en plus de l'ID. De plus, j'ai besoin de la propriété pour vivre toute la vie de l'objet Process, que le processus soit en cours ou non. – Chad
l'ID de processus est la représentation de l'identité du processus. :-) Donc, votre clé devrait être l'identifiant du processus. bien sûr, vous voulez évidemment garder l'objet Process associé à celui-ci plus quelques données supplémentaires que vous conservez dans votre dictionnaire actuel. Vous avez des options - soit étendre les données que vous gardez dans le dictionnaire avec l'objet Process et le mettre en clé par l'ID, soit ajouter un second dictionnaire où vous gardez les objets Processus entrés par ID. –
Les ID de processus (PID) ne sont pas une bonne représentation de l'identité du processus. Si un processus se termine, l'OS est libre de réutiliser le même PID pour un nouveau processus plus tard. Un Tuple de l'ID du processus et l'heure à laquelle le processus a commencé (pour traiter le cas du recyclage PID) est une bien meilleure identité. –