C#Process + Backgroundworker&定时器错误

时间:2011-07-13 11:40:18

标签: c#

我有一些产生进程的代码,正在执行的文件是Java应用程序,我的目的是从中读取输出。

问题在于,当我调用Start时,我无法在该点之后读取输出流。如果我在调用Console.Beep后测试并调用Start,则会发出蜂鸣声 - 所以它显然正在执行这些行。

Control.CheckForIllegalCrossThreadCalls = false; 

Process java = new Process();
java.StartInfo.FileName = "java";
java.StartInfo.Arguments = "-Xms1024M -Xmx1024M -jar craftbukkit-0.0.1-SNAPSHOT.jar nogui";
java.StartInfo.RedirectStandardOutput = true;
java.StartInfo.UseShellExecute = false;
java.Start();

System.Console.Beep();
System.Console.Write("hejsan");
StreamReader Reader = java.StandardOutput;

txtLog.Text = Convert.ToString(System.Console.Read());
broadcast(Convert.ToString(System.Console.Read()), "[Server]", false);

为什么我无法从输出流中读取?

1 个答案:

答案 0 :(得分:1)

请查看Microsoft StandardOutput的参考资料。

基本上,您需要调用WaitForExit并尝试在之后读取流。这是一个阻塞调用,所以除非你用它和异步做一些时髦的东西,这是相当直接的:

if (java.Start())
{
    java.WaitForExit();
    var reader = java.StandardOutput;
    output = reader.ReadToEnd();
}

这里值得一提的是Start方法返回一个布尔值,表示该过程是否真正开始 - 这有助于我们决定做什么,以及我们是否可以做到。

另一方面,我不禁注意到你实际上并没有尝试从输出流中读取,你只需要声明一个带有引用的变量;为了利用它,你需要调用类暴露的方法,例如ReadToEnd - 我已经在上面的例子中添加了用法。