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

ラムダを使用するだけです:

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

コンパイラは、多くの IL、隠しクラス、隠しメソッドを生成して、すべてを機能させます。

ラムダは、署名を適応させ、追加の状態を渡すのに最適です。

于 2013-07-12T19:15:42.563 に答える
4

のようにイベント ハンドラーのシグネチャを変更することはできませんが、イベント ハンドラー コードでは、実際には元のプロセスのインスタンスであるため、型としてProcess.Exitedキャストできます。プロセスがわかったので、JobNumber を特定できます。senderProcesssender

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 に答える