0

これを使用して、コントローラーのアクションからプロセスを実行します

            var psi = new ProcessStartInfo(utilityPath, String.Format("{0} {1}", inputfilePath, outputfilePath))
            {
                WorkingDirectory = Environment.CurrentDirectory,
                UseShellExecute = false,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                CreateNoWindow = true
            };

            using (var process = new Process { StartInfo = psi })
            {
                process.EnableRaisingEvents = true;
                process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
                process.ErrorDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
                process.Exited += new EventHandler(process_Exited);

                // start the process and start reading the standard and error outputs
                process.Start();

                process.BeginErrorReadLine();
                process.BeginOutputReadLine();
                //process.WaitForExit(); //If this is commented out the delegate process_Exited never fires
            }

process.WaitForExit(); なんらかの理由で使用しないと、ここに登録されたデリゲートprocess.Exited += new EventHandler(process_Exited);は決して発火しません。

ここで何が間違っていますか?

4

1 に答える 1

2

プロセスが終了する前に変数とコントローラーがガベージ コレクションされるprocess_Exitedため、ハンドラーが起動することはありません。processコメントを外すprocess.WaitForExit()と、現在のスレッドはプロセスが終了するまでブロックされ、コントローラーとprocess変数はガベージとして認識されず、収集されません。

于 2013-08-20T14:14:49.137 に答える