процесс не выводит свою последнюю строку C #

1

Я пытаюсь запустить 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) запускать все, что у него есть в этом буфере, а не когда специальный сигнал, например, уволен (например, выход из процесса или новая строка)

Теги:
process
plink

1 ответ

1
Лучший ответ

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
}
  • 0
    Я все еще пытаюсь разобраться с этой проблемой, не могли бы вы объяснить, как можно реализовать ожидание данных или чтение стандартного вывода?
  • 0
    @LordTitiKaka Боюсь , я добавил к моему ответу только , чтобы показать , что все становится более сложным.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню