Unity Editor зависает при запуске нескольких System.Diagnostics.Process один за другим, пока не завершится последний процесс - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть метод, который запускает внешний процесс через System.Diagnostics.Process и возвращает его вывод в виде строки:

public static string ExecuteCommand(string command, string arguments)
{
    var processInfo = new System.Diagnostics.ProcessStartInfo(command, arguments));
    processInfo.CreateNoWindow = true;
    processInfo.RedirectStandardOutput = true;
    processInfo.UseShellExecute = false;

    string output = "";
    var process = System.Diagnostics.Process.Start(processInfo);

    while (!process.StandardOutput.EndOfStream)
        output += process.StandardOutput.ReadLine() + "\n";

    process.WaitForExit();
    process.Close();

    Debug.Log(output);
    return output;
}

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

ExecuteCommand("adb", "install test.apk")
Debug.Log("A")
ExecuteCommand("adb", "uninstall com.app.test")
Debug.Log("B")
ExecuteCommand("adb", "push file.mp4")
Debug.Log("C")

Редактор зависнет, и когда последняя команда (adb push) завершит выполнение A, B и C будут напечатаны сразу. Я понимаю, что метод ExecuteCommand блокирует, но не должен контролировать возвращение в Unity Editor после его завершения и разрешать распечатывать отладочные сообщения между вызовами?

Как я могу это исправить? Я не возражаю против зависания редактора при выполнении команд, но я хотел бы дать пользователю какие-то указания на то, что команды работают нормально, поскольку все они вместе могут занимать довольно много времени. В некоторых темах в Интернете предлагалось использовать сопрограммы, но для меня это не вариант, потому что это скрипт EditorWindow.

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