我有一个服务器应用程序,基本上使用richtextbox作为控制台文本。问题是,我已经启动,重启和停止按钮 - 但我的重启按钮不起作用。
继承我重启按钮的代码:
consoletxt("RESTART", "Restarting Server...");
statuslabel1.Text = "Restarting";
statuslabel1.ForeColor = Color.Orange;
statuslabel2.Text = "Restarting";
statuslabel2.ForeColor = Color.Orange;
command("stop");
//The performclick just starts the server
startbtn.PerformClick();
statuslabel1.Text = "Online";
statuslabel1.ForeColor = Color.DarkGreen;
statuslabel2.Text = "Online";
statuslabel2.ForeColor = Color.DarkGreen;
consoletxt("RESTART", "Restart completed, server online!");
然而,输出是这样的:
2012-04-01 11:32:12 [RESTART] Restarting Server...
2012-04-01 11:32:12 [RESTART] Restart completed, server online!
2012-04-01 11:32:12 [INFO] CONSOLE: Stopping the server..
2012-04-01 11:32:12 [INFO] Stopping server
所以,它说文本中的重启已经完成 - 但它没有 - 它所做的就是停止服务器。
PERFORMCLICK的代码:
try { var x = ServerProc.StartTime; return; }
catch { }
try
{
ServerProc.Start();
ServerProc.BeginErrorReadLine();
statuslabel1.Text = "Online";
statuslabel1.ForeColor = Color.DarkGreen;
statuslabel2.Text = "Online";
statuslabel2.ForeColor = Color.DarkGreen;
}
请大家向我解释如何正确地做到这一点?
谢谢!
答案 0 :(得分:1)
好的,好吧:
首先,你应该从不只捕获异常并且什么都不做。如果服务器尚未启动,大概你会期待一个肯定的例外 - 所以赶上特定的异常,理想情况下将其记录在某个地方。或者,如果 all 可能,请创建一些更合适的API以检测它是否已经启动。
其次,假设ServerProc
是Process
,您已经启动了流程本身 - 但这并不意味着服务器此时已经“正常运行并准备就绪”。听起来你可能想要进行某种轮询,这样你就可以知道服务器实际运行的时间(或者无法正常启动)。在不知道服务器的用途的情况下,很难知道应该是什么样子。你可能会在它实际准备就绪时写入它的标准输出/错误,或者你可以对它做出一些无害的请求,直到它做响应 - 大概是超时,这样如果它需要超过一个几秒钟开始,你可以中止。
编辑:听起来你可能想要将最后一段代码称为“在线”(似乎在两个地方......)移动到一个单独的方法。当您的“线路处理”代码发现“我已经开始”消息时,它应然后报告服务器已启动。您可能还需要设置一个计时器,以便在服务器未在几分钟内启动时,您可以中止该过程或任何适当的过程。