2013-07-12 105 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非常適合簽名和傳遞附加狀態。