我有一个用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没有响应 我必须在进程退出后更新文本框。有没有办法解决这个问题?
感谢您的帮助。
答案 0 :(得分:1)
问题在于,当您调用myProcess.StandardOutput.ReadToEnd()
时,您导致C#应用程序阻塞并等待生成的进程(Perl程序)完全完成并退出。因此,即使你是正确的,Perl进程可以单独运行而不影响父应用程序,你已经编写了父应用程序,以便它不能像你想要的那样继续运行。
解决此问题的方法是使用单独的线程或某种异步方法来收集输出,以便主线程可以继续运行和处理窗口消息。 @Rubens建议的BeginOutputReadLine
方法是一种方法,或者您可以通过QueueUserWorkItem
使用线程池线程,甚至可以创建一个全新的线程。我的建议是从BeginOutputReadLine
开始,如果不能满足您的需求,只能使用其他方法之一。
答案 1 :(得分:0)
请查看ProcessStartInfo.RedirectStandardOutput property
的MSDN条目,因为它建议使用BeginOutputReadLine
。