我如何使用C#'新进程'对象执行此操作

时间:2009-11-08 23:46:21

标签: .net events process delegates

我希望将一些数据传递给Process对象的委托方法,当它触发Exited事件时 - 我不确定如何。


我有一些代码(在Windows服务中)需要一段时间......所以我要求一个新程序来做...就像...

string recipientEmail = "whatever@blah.com";

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

现在,当这完成时,我希望做一些其他的事情。例如,发送电子邮件。

现在,我们可以做到这一点并不太难: -

commandProcess.EnableRaisingEvents = true;

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

现在,我不确定在recipientEmail事件被触发时我如何将变量CommandProcess_Exited传递给方法Exited

例如CommandProcess_Exited方法将调用的方法: -

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

这可能吗?

2 个答案:

答案 0 :(得分:4)

您可以将变量设置为非局部变量,即在类中声明它,使其对事件处理方法可见。

或者您可以使用委托并编写内联方法,这样您就可以访问本地变量:

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

答案 1 :(得分:1)

对于类似这样的事情,我倾向于扩展EventArgs类并创建我自己的版本,其中包含所需的数据:

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

     public string RecipientEmail { get; set; }
}

然后你可以做的是从程序本身捕获Exited,对args做一些预处理,然后调用方法:

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 = "whatever@blah.com";
    CommandProcess_Exited(sender, args);
}

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