c#process将控件返回到父进程问题

时间:2009-12-10 20:54:34

标签: c# process

我有一个用c#lauch perl脚本编写的窗体应用程序。

除了一个问题外,一切正常。当perl脚本运行时,它运行为 通过c#应用程序启动进程。我在perl脚本中有一些延迟 等待来自套接字接口的消息。

由于这些延迟,当c#应用程序运行脚本时,GUI看起来没有响应状态。我正在使用Process类来运行脚本。我的问题是 有办法将控制权交还给父进程,来自perl脚本的c#应用程序 过程

我认为c#中的process.start()正在分支一个不应该影响的新进程 GUI或c#应用程序本身。

以下是启动perl脚本的代码:            循环遍历所有perl脚本......            {             处理myProcess = new Process();                 MessageBox.Show((字符串)curScriptFileName);

            string ParentPath = findParentPath((string)curScriptFileName);

            ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("perl.exe");
            myProcessStartInfo.Arguments = (string)(curScriptFileName);
            myProcessStartInfo.UseShellExecute = false;
            myProcessStartInfo.RedirectStandardOutput = true;
            myProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            myProcessStartInfo.CreateNoWindow = true;
            myProcessStartInfo.WorkingDirectory = ParentPath;
            myProcess.StartInfo = myProcessStartInfo;
            myProcess.Start();

            // Read the standard output of the spawned process.
            output = myProcess.StandardOutput.ReadToEnd();
            //MessageBox.Show(output);
            //this.ScriptTestResultTextBox.AppendText(output);
            //Console.WriteLine(output);
            myProcess.WaitForExit();
        }
        this.ScriptTestResultTextBox.AppendText(output);

正如您所看到的,我曾经把文本框附加代码放在循环中。我期望 我可以立即更新。但是现在,由于延迟,GUI没有响应 我必须在进程退出后更新文本框。有没有办法解决这个问题?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

问题在于,当您调用myProcess.StandardOutput.ReadToEnd()时,您导致C#应用程序阻塞并等待生成的进程(Perl程序)完全完成并退出。因此,即使你是正确的,Perl进程可以单独运行而不影响父应用程序,你已经编写了父应用程序,以便它不能像你想要的那样继续运行。

解决此问题的方法是使用单独的线程或某种异步方法来收集输出,以便主线程可以继续运行和处理窗口消息。 @Rubens建议的BeginOutputReadLine方法是一种方法,或者您可以通过QueueUserWorkItem使用线程池线程,甚至可以创建一个全新的线程。我的建议是从BeginOutputReadLine开始,如果不能满足您的需求,只能使用其他方法之一。

答案 1 :(得分:0)

请查看ProcessStartInfo.RedirectStandardOutput property的MSDN条目,因为它建议使用BeginOutputReadLine