2010-10-22 7 views
2

J'utilise la classe System.Diagnostics.Process pour exécuter un programme de ligne de commande. J'utilise la méthode OutputDataReceived pour rediriger la sortie vers ma propre méthode. Toutefois, plusieurs threads exécutent plusieurs instances de ce programme cmd. Toutefois, plusieurs threads exécutent plusieurs instances de ce programme cmd. Ce que je veux faire est d'être capable d'identifier l'instance de processus dont proviennent les données de sortie - idéalement, une chaîne contenant un nom. (Chaque processus a sa propre barre de progression sur une interface graphique.J'en crée un autre pour passer la sortie à l'interface graphique, ainsi, j'ai besoin de savoir de quel processus proviennent les données pour mettre à jour leur barre de progression).C# - Remplacement d'un gestionnaire d'événements - Ajout d'un paramètre

j'ai commencé à expérimenter:

public override delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e, string processName); 

Alors je compris que je dois remplacer la méthode OutputDataReceived dans la classe Process. Ce qui à son tour signifierait que je dois créer une classe personnalisée qui hérite de System.Diagnostics.Process, et avoir une méthode qui accepte un argument de chaîne afin que l'événement OutputDataReceived puisse passer le nom de l'instance de processus (chaîne) à mon DataReceivedEventHandler surchargé.

Le but de la question est d'obtenir quelques opinions sur la façon de procéder. Est-ce que ce que je propose semble être la bonne façon d'accomplir ce que je veux? Ou, y a-t-il une meilleure façon de le faire?

+0

Il suffit de créer une petite classe d'aide. Il peut stocker l'instance de processus, plus tout autre état dont vous avez besoin, en tant que champs privés. –

Répondre

5

Ne pouvez-vous pas simplement utiliser l'objet sender et vérifier quel processus il est en cours d'exécution?

+0

Il n'y a pas d'informations dans l'objet émetteur pour identifier le processus. – nf313743

+0

En regardant les attributs de processus. Je pourrais définir le nom du processus en utilisant l'attribut Process.StartInfo.Domain. Probablement pas une bonne pratique de programmation car Domain n'est pas censé être utilisé comme ça, mais ça devrait marcher. – nf313743

2

Vous pouvez typer le paramètre de l'expéditeur à l'objet de processus (pr dans l'extrait de code)

5

Outre les réponses existantes de l'utilisation du sender, vous pouvez également utiliser des expressions lambda (ou méthode anonyme) pour vous simplifier la tâche :

pr.OutputDataReceived += (sender, args) => HandleData(pr, args); 

HandleData aurait une signature de

void HandleData(Process process, DataReceivedEventArgs e) 

Les fonctions anonymes sont un moyen très pratique de propager des informations qui sont connues localement au moment de la souscription d'un événement au code qui doit gérer l'événement.