c#进程+后台工作者&计时器的错误

本文关键字:计时器 错误 工作者 进程 后台 | 更新日期: 2023-09-27 18:01:52

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

问题是,当我调用Start时,我无法读取该点之后的输出流。如果我在调用Start之后测试并调用Console.Beep,那么哔哔声就会出现-所以它显然是在执行这些行。

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);

为什么我不能从输出流中读取?

c#进程+后台工作者&计时器的错误

看看这个微软标准输出参考。

基本上,您需要调用WaitForExit并尝试读取之后的流。这是一个阻塞调用,所以除非你对它和异步做一些奇怪的事情,否则这是相当直接的:

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

这里值得一提的是,Start方法返回一个布尔值,指示进程是否实际启动-这有助于我们决定要做什么,以及我们是否可以这样做。

在另一个注意事项上,我不禁注意到你实际上并没有尝试从输出流中读取,你只是声明了一个变量并引用了它;为了利用它,您需要调用该类公开的方法,例如ReadToEnd—我在上面的示例中添加了用法。