Получение в реальном времени возврата от консольного приложения с использованием WaitForExit(); - C#

Узнай цену своей работы

Формулировка задачи:

Вроде и тема уже изъезженная и вдоль и поперек, но что то не могу дать ладу уже два вечера. Есть функция:
private bool wimlib(string cmd, string file, string param = "")
        {
            bool res;
            try
            {
               
                    string wlib_exe = "";
                    wlib_exe = Environment.CurrentDirectory + "\\wimlib-imagex.exe"; 
                    
                Process wlib = new Process();
                wlib.StartInfo.FileName = wlib_exe;
                string arguments = cmd + " "" + @file + "" " + param;
                wlib.StartInfo.Arguments = arguments;
                wlib.StartInfo.UseShellExecute = false;
                wlib.StartInfo.CreateNoWindow = true;
                wlib.StartInfo.RedirectStandardOutput = true;
                wlib.StartInfo.RedirectStandardError = true;
 
                wlib.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(866);
 
                wlib.OutputDataReceived += new DataReceivedEventHandler(wlib_result);
                wlib.ErrorDataReceived += new DataReceivedEventHandler(wlib_result);
            
                wlib.EnableRaisingEvents = true;
                wlib.Exited += new EventHandler(wlib_exit);
                wlib.Start();
               
                wlib.BeginOutputReadLine();
                wlib.BeginErrorReadLine();
                wlib.WaitForExit();
                
                res = true;
                return res;
            }
            catch (Exception error)
            {
                res = false;
                MessageBox.Show("Error starting!\n" + error.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return res;
            }
        }
И есть соответствующий

wlib_result()

:
private void wlib_result(object sender, DataReceivedEventArgs e)
        {
            BeginInvoke(new MethodInvoker(delegate
            {
                  if (!String.IsNullOrEmpty(e.Data))
                  {
                      textBox1.AppendText(e.Data + Environment.NewLine);
                  }
              })); 
        }
Функция wimlib() вызывается функцией типа:
private void create()
{
//много кода
progressBar1.Minimum = 0;
            progressBar1.Maximum = f_image.GetLength(0) * 2;
            progressBar1.Value = 0;
            progressBar1.Step = 1;
 
for (int p = 0; p < f_image.GetLength(0); p++) // f_image.GetLength(0) может быть от 1 до ~5-10
{
//тут генерятся значения p1, p2
wimlib("export", first_file, p1);
progressBar1.PerformStep();
 
wimlib("export", second_file, p2);
progressBar1.PerformStep();
}
textBox1.AppendText("Операция завершена.");
}
В процессе функция выполняется несколько минут и должна генерировать несколько сот строк "обратки".

create()

в свою очередь вызывается функцией:
private void button3_Click(object sender, EventArgs e)
{
//много кода
create();
}
Проблема в том, что возврат (несколько сот строк) в

textBox1

я получаю вообще в конце окончания всего цикла (это около 5 минут) и

после

надписи "Операция завершена."
Не понятно почему вообще textBox1 заполяняется в конце цикла, а не после каждого запуска

wimlib()

? Если убрать (для отладки)

wlib.WaitForExit();

обратку получаю в реалтайме в виде какого то перемешанного бреда сразу от нескольких потоков. Само собой функция как полагается не работает, т.к. каждый вызов wimlib() должен происходить после завершения предыдущего вызова. Тема достаточно истоптана вроде, но из всего найденного в гугле оно либо не работает, либо не разобрался как это применить.

Буду искренне благодарен за заведомо рабочий пример, который будет возвращать "обратку" построчно в реальном времени и что бы форма не "тупила" (весьма желательно, т.к. во время она хоть и не зависает совсем (progressBar заполняется), но окно нельзя переместить на рабочем столе и оно явно тормозит) пока происходит отработка функции

wimlib()

.

Решение задачи: «Получение в реальном времени возврата от консольного приложения с использованием WaitForExit();»

textual
Листинг программы
            progressBar1.Minimum = 0;
            progressBar1.Maximum = f_image.GetLength(0) * 2;
            progressBar1.Value = 0;
            progressBar1.Step = 1;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы