- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个用 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/
所以我使用 PyGame 制作了 Pong,我想使用遗传算法让 AI 学习玩这个游戏。我希望它只知道其桨、球和控件的位置。我只是不知道如何让人工智能自己移动桨。我不想这样做:“如果球在你上方,就向上。
我有包含 4 个子选项卡的 TabControl。 每个选项卡都包含图片框控件。 我需要获取选中的Tab控件的图片框控件。 知道如何实现吗? 最佳答案 也许 var picBox = TabContr
我需要使用 Java 代码控制 Windows XP 的 Windows,我需要单击/键入 windowsXP 给定窗口的特定按钮/文本字段,如何做到这一点有什么想法吗? 我尝试过的方法是:(1) 我
我是一名优秀的程序员,十分优秀!