Я пытаюсь запустить Plink через С#, используя этот код
public void RunProcess(string FileName, string Arguments, bool EventWhenExit , bool IsWaitBeforeStart = true)
{
process = new Process();
process.OutputDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent);
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = FileName; // Gets or sets the application or document to start.
process.StartInfo.Arguments = Arguments;//Gets or sets the set of command-line arguments to use when starting the application
if (IsWaitBeforeStart) Thread.Sleep(5000);
if (EventWhenExit)
{
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(myprocess_Exited);
}
process.Start();
process.BeginOutputReadLine();
PID = process.Id;
ProcessInputStream = process.StandardInput;
}
Когда я запускаю Plink (используя этот аргумент: -telnet #IPAddr
), я замечаю, что последняя строка срабатывает только при закрытии процесса. Я предполагаю, что он держит последнюю строку до последнего сигнала строки или что-то вроде этого уволен
Как заставить этот процесс (не только Plink of-course) запускать все, что у него есть в этом буфере, а не когда специальный сигнал, например, уволен (например, выход из процесса или новая строка)
BeginOutputReadLine()
ожидает символ новой строки или конец потока. К сожалению, не существует BeginOutputRead()
который обеспечивает поведение, которое вы желаете. У вас есть доступ к process.StandardOutput
хотя (StreamReader
), на котором операции Read()
возвращаются всякий раз, когда доступны данные.
В настоящее время строка в консольном приложении "завершена", как только она завершается символом новой строки. Поскольку для этой последней строки символ новой строки не выводился, вам нужно как-то определить, закончилось это или нет. Рассмотрим следующий пример:
Console.Write("This is the ");
Console.Write(" plink output ");
Console.Write(" that I'm trying to read");
LongRunningActivity();
Console.Write(".");
Console.WriteLine();
Вы можете получить эти сегменты данных отдельно. Когда линия заканчивается? До LongRunningActivity()
?
Поэтому, когда вы пытаетесь прочитать данные перед символом новой строки, вам придется подумать о некоторых правилах, чтобы определить, завершилось ли сообщение.
Пример выполнения этой задачи в отдельном потоке:
...
process.Start();
Task.Factory.StartNew(new Action<object>(ReadFromStreamReader), process.StandardOutput);
void ReadFromStreamReader(object state)
{
StreamReader reader = state as StreamReader;
char[] buffer = new char[1024];
int chars;
while ((chars = reader.Read(buffer, 0, buffer.Length)) > 0)
{
string data = new string(buffer, 0, chars);
OnDataReceived(data);
}
// You arrive here when process is terminated.
}
void OnDataReceived(string data)
{
// Process the data here. It might contain only a chunk of a full line
// remember to use Invoke() if you want to update something in your form GUI
}