2013-07-12 81 views
2

我开始一个使用process.exited来发送程序指令,指示如何处理完成的进程。C#通过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 
} 

我想从x264_thread发送process_Exited()方法的参数

+0

它是'进程' - 一个'c',两个's' .. –

回答

2

不能更改签名的事件处理程序(如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 
} 
6

只需使用lambda:

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

编译器现在会产生大量的白细胞介素,一个隐藏的类和隐藏的方法,使其所有的工作。

Lambdas非常适合签名和传递附加状态。