c#进程将控制权交还给父进程问题

标签 c# process

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

除一个问题外,一切正常。当 perl 脚本运行时,它作为 进程由 C# 应用程序启动。我在 perl 脚本中设置了一些延迟 等待来自套接字接口(interface)的消息。

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

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

这是我启动 perl 脚本的代码: 遍历所有 perl 脚本... { 进程 myProcess = new Process(); MessageBox.Show((string)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 没有响应 我必须在进程退出后更新文本框。有没有办法解决这个问题?

感谢您的帮助。

最佳答案

问题是,当您调用 myProcess.StandardOutput.ReadToEnd() 时,您会导致 C# 应用程序阻塞并等待生成的进程(Perl 程序)完全完成并退出。因此,即使您认为 Perl 进程可以单独运行并且不会影响父应用程序是正确的,但您已经对父应用程序进行了编码,使其无法像您希望的那样继续运行。

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

关于c#进程将控制权交还给父进程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1883952/

相关文章:

c++ - 如何在 C++ 中将字节数组发送到另一个进程

c# - PCL Profile 158 中的 Async/await 也针对 Android 和 IOS

c# - 是否可以在该属性的 getter 中获取属性值?

c# - 空引用异常 C#

c# - iis上部署的asp.net core应用遇到500 internal server error

c# - 具有相同名称的所有进程的性能计数器?

linux - 嵌入式linux子进程创建问题

c# - 如何从动态 C# 代码编译中获取错误信息

c# - 在 C# 中将参数传递给正在运行的进程

java - 从 java 杀死 linux 进程在 Runnable JAR 中不起作用