C# 重定向标准输出/错误不会调用标准输出/错误的我的事件
嗨,我正在尝试为我的系统构建一个解析器来管理我的Tekkit服务器我正在使用C#但是我在我的Tekkit服务器进程上重定向了StandardOutput,并且有一个方法设置,可以在添加到列表后将该输出发送到我的控制台,但它没有添加到C# 重定向标准输出/错误不会调用标准输出/错误的我的事件,c#,httplistener,C#,Httplistener,嗨,我正在尝试为我的系统构建一个解析器来管理我的Tekkit服务器我正在使用C#但是我在我的Tekkit服务器进程上重定向了StandardOutput,并且有一个方法设置,可以在添加到列表后将该输出发送到我的控制台,但它没有添加到列表 这是我的密码: public void StartServer(string maxMem, string minMem, string path) { ThreadStart server = new ThreadStart(delegate() {
列表
这是我的密码:
public void StartServer(string maxMem, string minMem, string path)
{
ThreadStart server = new ThreadStart(delegate() { StartServerThread(maxMem, minMem, path); });
server.Invoke();
}
private void StartServerThread(string maxMem, string minMem, string TekkitPath)
{
try
{
TekkitServer.StartInfo.FileName = "java";
TekkitServer.StartInfo.Arguments = String.Format("-Xmx{0} -Xms{1} -jar \"" + TekkitPath + "\" -nojline nogui", maxMem, minMem);
TekkitServer.StartInfo.UseShellExecute = false;
TekkitServer.StartInfo.RedirectStandardInput = true;
TekkitServer.StartInfo.RedirectStandardOutput = true;
TekkitServer.OutputDataReceived += new DataReceivedEventHandler(TekkitServer_OutputDataReceived);
IsStarted = TekkitServer.Start();
TekkitServerInput = TekkitServer.StandardInput;
}
catch (Exception)
{
}
}
void TekkitServer_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
/*B*/recordedData.Add(e.Data);
Console.Out.WriteLine(e.Data);
}
当
/*B*/
是断点时,默认情况下断点从不激活,标准输出指向控制台窗口。如果需要对其执行某些操作,则需要重定向它,因此,需要设置
RedirectStandardOutput=true要激发的事件的代码>
编辑:这是我的工作代码(省略了错误处理和日志记录):
代码中最可能缺少的链接是实际获取处理程序方法的
另外,我使用一个新的进程
对象,并等待它完成它的工作,因此,不可能干扰以前的调用。需要考虑的其他事项:可能是写入StandardError。@AustinSalonen检查了它没有发生。出于某种原因,我的应用程序从未处理过输出。我尝试过这个方法,但它不起作用,因此,我之所以尝试关闭它,是因为我缺少TekkitServer.EnableRaisingEvents=true代码>你没有显示过的witch,所以不确定没有它为什么它不能在我的上工作?我可以确认我没有设置EnableRaisingEvents
属性,从中可以看出,它似乎只涉及退出的
事件(我也没有)。但是,我确实有一个同步的WaitForExit
调用。无论如何,我认为输出流在流程开始时就可用,而不仅仅是在流程完成后。很高兴您解决了问题。这可能与Java中的Tekkit服务器有关
public int ExecuteCommand(CommandParameters parameters)
{
Process process = new Process();
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.OutputDataReceived += StdOutputHandler;
process.ErrorDataReceived += StdErrorHandler;
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = ...;
process.StartInfo.Arguments = ...;
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
process.WaitForExit(parameters.Timeout);
return process.ExitCode;
}
private void StdOutputHandler(object sendingProcess, DataReceivedEventArgs outdata)
{
if (!string.IsNullOrEmpty(outdata.Data))
{
OutputMessages.Add(outdata.Data);
}
}