У меня есть программа, которая часто использует внешнюю программу и считывает ее выходы. Он работает очень хорошо, используя ваш обычный процесс перенаправления вывода, но один конкретный аргумент по какой-то причине зависает, когда я пытаюсь его прочитать, никакое сообщение об ошибке - исключение, оно просто "останавливается", когда оно достигает этой строки. Я, конечно, использую централизованную функцию для вызова и чтения вывода из программы, которая заключается в следующем:
public string ADBShell(string adbInput)
{
try
{
//Create Empty values
string result = string.Empty;
string error = string.Empty;
string output = string.Empty;
System.Diagnostics.ProcessStartInfo procStartInfo
= new System.Diagnostics.ProcessStartInfo(toolPath + "adb.exe");
procStartInfo.Arguments = adbInput;
procStartInfo.RedirectStandardOutput = true;
procStartInfo.RedirectStandardError = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
procStartInfo.WorkingDirectory = toolPath;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
// Get the output into a string
proc.WaitForExit();
result = proc.StandardOutput.ReadToEnd();
error = proc.StandardError.ReadToEnd(); //Some ADB outputs use this
if (result.Length > 1)
{
output += result;
}
if (error.Length > 1)
{
output += error;
}
Return output;
}
catch (Exception objException)
{
throw objException;
}
}
Линия, которая висит, result = proc.StandardOutput.ReadToEnd();
, но опять же, не каждый раз, только при отправке определенного аргумента ( "start-server" ). Все остальные аргументы работают очень хорошо - он считывает значение и возвращает его.
Это также странно, как он висит. Он не замерзает или не дает ошибку или что-то еще, он просто прекращает обработку. Как будто это была команда "return", за исключением того, что она даже не возвращается к вызывающей функции, она просто останавливает все, пока все еще работает и работает интерфейс.
Кто-нибудь испытал это раньше? Кто-нибудь знает, что я должен попробовать? Я предполагаю, что это что-то неожиданное в самом потоке, но есть ли способ, которым я могу обрабатывать/игнорировать это, чтобы он все равно читал?