.net 如何在不阻塞执行的情况下写入System.Diagnostic.Process输出?
我正在尝试编写一个简单的软件,在Mono Gtk/.NET中播放卡拉OK。 我只是想通过shell运行一些类似timidity filename的东西。kar timidity是一个软件合成器。 我想将Timbity输出写入textview,但问题是如果我运行此代码,Timbity将开始“播放”,但应用程序将退出 受保护的虚拟无效OnBtnPlayClicked对象发送方System.EventArgs e { string parms=filechooser.Filename; 字符串输出=; 字符串错误=string.Empty.net 如何在不阻塞执行的情况下写入System.Diagnostic.Process输出?,.net,process,.net,Process,我正在尝试编写一个简单的软件,在Mono Gtk/.NET中播放卡拉OK。 我只是想通过shell运行一些类似timidity filename的东西。kar timidity是一个软件合成器。 我想将Timbity输出写入textview,但问题是如果我运行此代码,Timbity将开始“播放”,但应用程序将退出 受保护的虚拟无效OnBtnPlayClicked对象发送方System.EventArgs e { string parms=filechooser.Filename; 字符串输出=;
ProcessStartInfo psi = new ProcessStartInfo("timidity", parms);
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
psi.UseShellExecute = false;
System.Diagnostics.Process reg;
reg = System.Diagnostics.Process.Start(psi);
reg.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
reg.BeginOutputReadLine(); // HERE THE APP GO CRASH
}
private void SortOutputHandler(object sendingProcess,
DataReceivedEventArgs outLine)
{
// Collect the sort command output.
if (!String.IsNullOrEmpty(outLine.Data))
{
txtOutput.Buffer.Text =txtOutput.Buffer.Text + outLine.Data;
}
}
我错在哪里
感谢您尝试读取生成的进程的标准输出,该输出将被阻止,直到该进程关闭其标准输出流。在这种情况下,将在进程终止时执行
相反,您需要做的是重定向标准输出,并在可用时从中读取块
例如:
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
reg = System.Diagnostics.Process.Start(psi);
reg.OutputDataReceived += (sender, args) =>
Console.WriteLine("received output: {0}", args.Data);
reg.BeginOutputReadLine();
如果你想完全异步工作,我建议像我在另一篇文章中详细介绍的那样,将线程和事件驱动分开
好的,谢谢。所以我用compiler.StartInfo.RedirectStandardOutput=true;compiler.Start;Console.WriteLinecompiler.StandardOutput.ReadToEnd;重定向输出,但无论如何我的应用程序会被阻塞!@stighy:你不能使用ReadToEnd,句号。我编辑了答案,请参见链接的MSDN页面上的示例,我在这里也添加了一个较短的版本。这段代码是h在检查答案并与答案一致后编辑,因此它可能仍然崩溃,并且答案可能是错误的。是否可以评论这是如何解决的,问题是什么?