等待完成下一个任务之前完成

时间:2012-04-01 11:23:30

标签: c#

我有一个服务器应用程序,基本上使用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;

            }

请大家向我解释如何正确地做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

好的,好吧:

首先,你应该从不只捕获异常并且什么都不做。如果服务器尚未启动,大概你会期待一个肯定的例外 - 所以赶上特定的异常,理想情况下将其记录在某个地方。或者,如果 all 可能,请创建一些更合适的API以检测它是否已经启动。

其次,假设ServerProcProcess,您已经启动了流程本身 - 但这并不意味着服务器此时已经“正常运行并准备就绪”。听起来你可能想要进行某种轮询,这样你就可以知道服务器实际运行的时间(或者无法正常启动)。在不知道服务器的用途的情况下,很难知道应该是什么样子。你可能会在它实际准备就绪时写入它的标准输出/错误,或者你可以对它做出一些无害的请求,直到它响应 - 大概是超时,这样如果它需要超过一个几秒钟开始,你可以中止。

编辑:听起来你可能想要将最后一段代码称为“在线”(似乎在两个地方......)移动到一个单独的方法。当您的“线路处理”代码发现“我已经开始”消息时,它应然后报告服务器已启动。您可能还需要设置一个计时器,以便在服务器未在几分钟内启动时,您可以中止该过程或任何适当的过程。