У меня есть следующий метод, как показано ниже, но по какой-то причине WaitForExit () не работает или не распознает предыдущую строку ввода.И это всегда входит в pNpmRun.Kill () часть оператора IF .
Я уже пробовал время ожидания от 0 до 10 минут, стот же результат (не входит в return pNpmRun.StandardOutput.ReadToEnd (); ).Но фактический "$ newman run ..." завершается в течение 3-5 секунд.
Что я также заметил, если вывести результат в файл при ошибке - он имеет другойКонец вывода.
Когда у меня есть следующая часть:
if (!pNpmRun.WaitForExit(60000))
{
File.WriteAllText(@"C:\\Postman\\FailedOutput.log", pNpmRun.StandardOutput.ReadToEnd());
pNpmRun.Kill();
throw new TimeoutException("Command didn't complete in 10 minute timeout");
}
Выход будет иметь следующий конец (там есть слово 'exit' ), и он также скажетэтот процесс уже завершился, когда он дошел до строки .Kill ():
... at assertion:0 in test-script
inside "SearchCatalogIndexForNonBatchTracked"
C:\src\bin\Debug>exit
Но если я переместлю .ReadToEnd () к .Kill (), как показано ниже:
if (!pNpmRun.WaitForExit(60000))
{
pNpmRun.Kill();
File.WriteAllText(@"C:\\Postman\\FailedOutput.log", pNpmRun.StandardOutput.ReadToEnd());
throw new TimeoutException("Command didn't complete in 10 minute timeout");
}
Выход будет иметь следующий конец (не имеет 'exit' ):
... at assertion:0 in test-script
inside "SearchCatalogIndexForNonBatchTracked"
И я не могу понять, почему все это происходит и работает не так, как я ожидаю.
public string Runner ()
{
var psiNpm = new ProcessStartInfo
{
FileName = "cmd",
RedirectStandardOutput = true,
RedirectStandardInput = true,
UseShellExecute = false
};
var pNpmRun = Process.Start(psiNpm);
pNpmRun.StandardInput.WriteLine("npm install -g newman");
pNpmRun.StandardInput.WriteLine("newman run " +
"\"C:\\Postman\\Test.postman.json\" " +
"--folder \"TestSearch\" " +
"--environment \"C:\\Postman\\postman_environment.json\" " +
"--disable-unicode");
pNpmRun.StandardInput.WriteLine("exit");
if(!pNpmRun.WaitForExit(600000)) {
pNpmRun.Kill();
throw new TimeoutException("Command didn't complete in 10 minute timeout");
} else {
return pNpmRun.StandardOutput.ReadToEnd();
}
}
Я ожидаю, что код почти всегда входит в:
else {
return pNpmRun.StandardOutput.ReadToEnd();
}