6

我启动了一个进程,用于process.exited发送程序指令,说明如何处理该进程已完成。

它工作正常,但我需要向该Process_Exited()方法发送一个参数。像这样的东西:

process.exited += Process_Exited(jobnumber);

但这不起作用。这是我的代码:

public void x264_thread(string jobnumber, string x264_argument, string audio_argument)
{
    file = new System.IO.StreamWriter("c:\\output\\current.out");
    mysqlconnect("UPDATE h264_encoder set status = 'running' where jobnumber = '" + jobnumber + "'");
    var proc = new Process();
    proc.StartInfo.FileName = "C:\\ffmbc\\ffmbc.exe";
    proc.StartInfo.Arguments = x264_argument;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;
    proc.EnableRaisingEvents = true;
    proc.StartInfo.CreateNoWindow = true;
    proc.ErrorDataReceived += proc_DataReceived;
    proc.OutputDataReceived += proc_DataReceived;
    proc.Exited += process_Exited(JobNumber); //This is where I would like to include a argument

    proc.Start();
    proc.BeginErrorReadLine();
    proc.BeginOutputReadLine();
}

然后转到process_Exited方法:

public void process_Exited(object sender, EventArgs e, string JobNumber) //This does not work. It does not pass the string JobNumber
{
    //Do Stuff
}

我想向该process_Exited()方法发送来自 x264_thread 的参数

4

2 回答 2

10

只需使用 lambda:

proc.Exited += (sender, e) => process_Exited(sender, e, JobNumber);

编译器现在生成大量的 IL、一个隐藏的类和一个隐藏的方法来使其全部工作。

Lambda 非常适合调整签名和传递额外的状态。

于 2013-07-12T19:15:42.563 回答
4

您不能更改事件处理程序的签名,Process.Exited但在您的事件处理程序代码中,您可以强制转换sender为类型Process,因为sender它实际上是您原始流程的实例。现在您知道了流程,您可以确定您的 JobNumber:

public void process_Exited(object sender, EventArgs e) 
{
    Process myProcess = (Process)sender;
    // use myProcess to determine which job number....
    // DoWork
}

现在,要获取与哪个进程关联的作业编号,您可以执行以下操作:

在您的班级中放置一个字段:

private Dictionary<Process, string> _processDictionary = 
                               new Dictionary<Process,string>();

在您的x264_thread方法中,您可以在创建流程后添加一个条目:

_processDictionary.Add(proc, jobnumber);

然后在您的事件处理程序中,您可以检索该值:

public void process_Exited(object sender, EventArgs e) 
{
    Process myProcess = (Process)sender;
    // use myProcess to determine which job number....
    var jobNumber = _processDictionary[myProcess];
    _processDictionary.Remove(myProcess);
    // DoWork
}
于 2013-07-12T18:40:49.210 回答