gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:33:48 25 4
gpt4 key购买 nike

我有一个用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com