.net 如何在不阻塞执行的情况下写入System.Diagnostic.Process输出?

.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; 字符串输出=;

我正在尝试编写一个简单的软件,在Mono Gtk/.NET中播放卡拉OK。 我只是想通过shell运行一些类似timidity filename的东西。kar timidity是一个软件合成器。 我想将Timbity输出写入textview,但问题是如果我运行此代码,Timbity将开始“播放”,但应用程序将退出

受保护的虚拟无效OnBtnPlayClicked对象发送方System.EventArgs e { string parms=filechooser.Filename; 字符串输出=; 字符串错误=string.Empty

    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在检查答案并与答案一致后编辑,因此它可能仍然崩溃,并且答案可能是错误的。是否可以评论这是如何解决的,问题是什么?