Как записать вывод System.Diagnostic.Process без блокировки выполнения? - PullRequest
0 голосов
/ 19 октября 2011

Я пытаюсь написать простое программное обеспечение, которое играет в караоке в Mono Gtk / .NET.Я просто хочу запустить через оболочку что-то вроде «timidity filename.kar» (timidity - программный синтезатор).Я хочу записать вывод робости в текстовое представление, но проблема в том, что если я запускаю этот код, робость начинает «играть», но приложение завершает

защищенный виртуальный void OnBtnPlayClicked (отправитель объекта, System.EventArgs e){string parms = filechooser.Filename;строка вывода = "";string error = 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;

        }
    }   

Где я ошибаюсь?

Спасибо

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Вы пытаетесь набрать ReadToEnd стандартного вывода порожденного процесса, который будет блокироваться до тех пор, пока этот процесс не закроет свой стандартный поток вывода.В этом случае это произойдет, когда процесс завершится.

Вместо этого вам нужно перенаправить стандартный вывод и считать его фрагменты, когда они станут доступны с помощью BeginOutputReadLine.

Например:

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();
0 голосов
/ 19 октября 2011

Если вы хотите работать полностью асинхронно, я предлагаю что-то наподобие того, что я подробно описал здесь в другом посте, например, отдельный поток и управляемый событиями.

Выполнить команду Promt Process Asnyc и получить результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...