C # Process DataReceivedEventHandler работает только один раз - PullRequest
0 голосов
/ 31 августа 2018

У меня есть приложение Unity, которое создает процесс, который пытается отправить команды на устройство Android через оболочку adb. Я могу отправлять команды в течение всего приложения. Но я получаю вывод только с устройства Android в первый раз. Я не знаю, если это проблема с буфером с OutputDataReceived. Входные данные проходят, но я не получаю никаких журналов в моем редакторе Unity. Если я поверну Process.StartInfo.CreateNoWindow в true, я смогу увидеть все выходные данные в оболочке adb, которая появляется вне Unity. Вывод не перенаправляется из этой консоли в Unity после первого выполнения.

    public void StartShellProcessAsync ()
    {
        ShellThread = new Thread(() =>
        {
            ShellProcess = new Process();
            ShellProcess.StartInfo.FileName = "adb.exe";
            ShellProcess.StartInfo.Arguments = "shell";

            ShellProcess.StartInfo.CreateNoWindow = false;
            ShellProcess.StartInfo.UseShellExecute = false;

            ShellProcess.StartInfo.RedirectStandardOutput = true;
            ShellProcess.StartInfo.RedirectStandardError = true;
            ShellProcess.StartInfo.RedirectStandardInput = true;

            ShellProcess.EnableRaisingEvents = true;
            ShellProcess.OutputDataReceived += new DataReceivedEventHandler(OnOutputDataReceived);
            ShellProcess.ErrorDataReceived += new DataReceivedEventHandler(OnErrorDataReceived);

            ShellProcess.Exited += new EventHandler(OnProcessExited);

            ShellProcess.Start();
            ShellProcess.BeginOutputReadLine();
            ShellProcess.BeginErrorReadLine();
            ShellProcess.WaitForExit();
        });
        ShellThread.Start();
    }

У меня есть кнопки в Unity, которые отправляют команды, как показано ниже:

am start -m <application activity>
am stack list

Я пытаюсь прочитать вывод из am stack list Это работает, если это первая команда, которую я посылаю. Но если я запускаю его после am start -m <application activity>, вывод не поступает в Unity.

Причина, по которой я запускаю ShellProcess внутри потока, заключается в том, чтобы процесс оставался открытым в течение всего времени выполнения приложения. Я не хочу создавать новый процесс для каждой команды, отправляемой в Android, так как она отнимает много времени.

1 Ответ

0 голосов
/ 31 августа 2018

Попробуйте заблокировать вашу тему. Это гарантирует, что одновременно активен только один процесс.

Будет некоторый конфликт, если новый поток вызывается, когда другой поток занят тем же процессом.

private readonly object balanceLock = new object();

//Place this code elsewhere
private void Instantiate_Shell_Once()
{

        ShellProcess = new Process();
        ShellProcess.StartInfo.FileName = "adb.exe";
        ShellProcess.StartInfo.Arguments = "shell";

        ShellProcess.StartInfo.CreateNoWindow = false;
        ShellProcess.StartInfo.UseShellExecute = false;

        ShellProcess.StartInfo.RedirectStandardOutput = true;
        ShellProcess.StartInfo.RedirectStandardError = true;
        ShellProcess.StartInfo.RedirectStandardInput = true;

        ShellProcess.EnableRaisingEvents = true;
        ShellProcess.OutputDataReceived += new DataReceivedEventHandler(OnOutputDataReceived);
        ShellProcess.ErrorDataReceived += new DataReceivedEventHandler(OnErrorDataReceived);

        ShellProcess.Exited += new EventHandler(OnProcessExited);

}

public void StartShellProcessAsync ()
{
    ShellThread = new Thread(() =>
    {
        lock(balanceLock)
        {

        ShellProcess.Start();
        ShellProcess.BeginOutputReadLine();
        ShellProcess.BeginErrorReadLine();
        ShellProcess.WaitForExit();

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