Процесс завершается преждевременно при выполнении из графического интерфейса, а не при запуске через приложение тестирования консоли - PullRequest
0 голосов
/ 05 июня 2019

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

Я разрабатываю компонент, который при вызове должен запуститьОбработайте и дождитесь его завершения.Процесс может захотеть перенаправить вывод std в пользовательскую winform-форму (всплывающее окно), чтобы пользователь мог получить отзыв о состоянии процесса.

Чтобы протестировать компонент перед его реализацией в официальном приложении, я 'мы разработали консольное приложение, которое вызывает модуль, точно так же, как официальное приложение будет принимать входные данные пользователя из GUI -> не всплывающее окно, главное окно приложения.

При тестировании в консольном приложении,все работает как я ожидаю.При тестировании в официальном приложении с графическим интерфейсом процесс завершается преждевременно с кодом выхода 0 (все в порядке).Я имею в виду, что он печатает что-то в пользовательской форме win, до определенной точки, всегда в одной и той же точке, а затем завершается.

Я не могу понять, почему или как определить первопричины, и, возможно, что-то с этим сделать.Я ищу помощь, здесь и далее исходный код модуля для выполнения процесса:

ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = myExePath;
processStartInfo.Arguments = myExeArguments;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = false;
processStartInfo.UseShellExecute = false;
processStartInfo.CreateNoWindow = true;
using (Process process = Process.Start(processStartInfo))
{
    process.EnableRaisingEvents = true;

    // accessory code. Issue is reproduced even without this section ---- //
    Thread t = new Thread(() =>
    {
        // show a custom winform for the user to read
    });
    t.Start();
    // ------------------------------------------ //

    process.OutputDataReceived += (s, a) => {
        // Do something with a.Data
    };

    process.BeginOutputReadLine();
    process.WaitForExit();
}

РЕДАКТИРОВАТЬ:

скажем, что процесс myExe должен распечатать что-то в стандартный вывод.Я прочитал это кое-что, и оно идет по следующему принципу:

line 1
line 2
I'm doing something
line 3
start doing something else <-- when component is integrated in official application, here Process Exits without exceptions
line 4
line 5 <-- When component is tested in Console app, here is where Process Exits without exceptions.

Я должен прочитать до строки 5 как в сценарии тестирования, так и в официальном сценарии.

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