У меня есть метод, который запускает внешний процесс через 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.