进程不输出它';最后一排是C#

进程不输出它';最后一排是C#,c#,process,plink,C#,Process,Plink,我正试着通过C#运行Plink 使用此代码 public void RunProcess(string FileName, string Arguments, bool EventWhenExit , bool IsWaitBeforeStart = true) { process = new Process(); process.OutputDataReceived += new DataReceivedEventHandler(OnDa

我正试着通过C#运行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)触发其缓冲区中的所有内容,而不是在触发特殊信号(如进程退出或换行)时(如进程退出或换行)

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
}
。。。
process.Start();
Task.Factory.StartNew(新操作(从StreamReader读取)、process.StandardOutput);
void ReadFromStreamReader(对象状态)
{
StreamReader=状态为StreamReader;
char[]buffer=新字符[1024];
int字符;
而((chars=reader.Read(buffer,0,buffer.Length))>0)
{
字符串数据=新字符串(缓冲区,0,字符);
收到的数据;
}
//当进程终止时,您到达这里。
}
已接收无效数据(字符串数据)
{
//在这里处理数据。它可能只包含整行的一块
//如果要更新表单GUI中的某些内容,请记住使用Invoke()
}

我仍在努力解决这个问题,你能解释一下如何实现等待数据或读取标准输出吗?@LordTitika我恐怕我在回答中添加了内容,只是为了表明事情变得更加复杂。@LordTitika你能解释一下你目前缺少什么吗?从
StreamReader
读取这是一种概念性的东西或只是代码?我的问题是我需要使用用户名和密码连接到服务器,但当我提示用户输入用户名后,屏幕仍然为空,因为您提到了什么,我猜到了,屏幕上没有打印“密码”。我的应用程序是winform,所以我不能只添加一些while循环来读取streamreader。我需要实现一个事件,当streamreader不为空时触发。我将重新思考我的问题,然后发布另一个问题。。。谢谢