Получение в реальном времени возврата от консольного приложения с использованием WaitForExit(); - C#
Формулировка задачи:
Вроде и тема уже изъезженная и вдоль и поперек, но что то не могу дать ладу уже два вечера.
Есть функция:
И есть соответствующий Функция wimlib() вызывается функцией типа:
В процессе функция выполняется несколько минут и должна генерировать несколько сот строк "обратки".
Проблема в том, что возврат (несколько сот строк) в
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); } })); }
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;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д