进程不输出它';最后一排是C#
我正试着通过C#运行Plink 使用此代码进程不输出它';最后一排是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
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不为空时触发。我将重新思考我的问题,然后发布另一个问题。。。谢谢