2009-11-08 5 views
0

Je souhaite passer des données à la méthode déléguée, d'un objet Process, quand il déclenche l'événement Exited --- je ne sais pas comment.Comment puis-je faire cela avec l'objet C# 'new Process'


J'ai un code (dans un service Windows) qui va prendre un certain temps .. donc je suis bifurquer hors un nouveau processus pour le faire .. comme ...

string recipientEmail = "[email protected]"; 

var commandProcess = new Process 
{ 
    StartInfo = 
     { 
      FileName = commandLine, 
      Arguments = commandArgs 
     } 
}; 
commandProcess.Start(); 

Maintenant, quand cela se termine, je souhaite faire d'autres choses. Par exemple, envoyez un email.

Maintenant, ce n'est pas trop dur quand on peut: -

commandProcess.EnableRaisingEvents = true; 

// Method to handle when the process has exited. 
commandProcess.Exited += CommandProcess_Exited; 

Maintenant, je ne sais pas comment je passe la recipientEmail variable à la méthode CommandProcess_Exited lorsque l'événement Exited est déclenché.

méthode par exemple que la méthode CommandProcess_Exited appellera: -

private static void SendEmailToRecipient(string recipientEmail) 
{ 
    .... 
} 

Est-ce possible?

Répondre

4

Vous pouvez rendre la variable non locale, c'est-à-dire la déclarer dans la classe afin qu'elle soit visible par votre méthode de gestion des événements.

Ou vous pouvez utiliser un délégué et d'écrire la ligne de la méthode, qui vous permet d'accéder à des variables locales:

commandProcess.Exited += delegate 
    { 
     SendEmailToRecipient(recipientEmail); 
    }; 
+0

Salut Johannes - pouvez-vous s'il vous plaît élaborer sur la deuxième méthode. J'ai pensé à la première méthode .. mais c'est un service Windows .. et cette classe est en fait statique, pas instance .... (dont j'ai omis de mentionner) .. oops: P –

+0

@ Johannes - J'ai mis à jour le publication initiale avec l'exemple Méthode de courrier électronique que je veux appeler. –

+0

J'ai supprimé ma réponse comme pour ce scénario particulier, il semblait un peu exagéré, c'est une solution beaucoup plus facile. – James

1

Pour quelque chose comme ça que je tends à faire est d'étendre la classe EventArgs et de créer ma propre version qui comprend les données requises:

public class MyProgramEventArgs : EventArgs 
{ 
    public MyProgramEventArgs() 
    { 
    } 

    public string RecipientEmail { get; set; } 
} 

alors ce que vous pouvez faire est de capturer le Exited du programme lui-même, faire un peu de pré-traitement sur les args, puis invoquer la méthode:

public static void Main(string[] args) 
{ 
    commandProcess.EnableRaisingEvents = true; 
    ... 
    commandProcess.Exited += OnProgramExited; 
} 

public void OnProgramExited(object sender, EventArgs e) 
{ 
    MyProgramEventArgs args = new MyProgramEventArgs(); 
    args.RecipientEmail = "[email protected]"; 
    CommandProcess_Exited(sender, args); 
} 

public void CommandProcess_Exited(object sender, MyProgramEventArgs e) 
{ 
    SendEmailToRecipient(e.RecipientEmail); 
} 
+0

+1 à vous, alors :-). – Joey