我有一些事情......
private UavControlForm()
{
InitializeComponent();
if (ControlFacade.CheckIfStkIsLaunched())
{
_controlFacade = new ControlFacade();
SubscribeToStkQuit();
}
else
{
Thread tExitUavController = new Thread(ExitUavController);
tExitUavController.IsBackground = true;
tExitUavController.Start();
}
}
private void ExitUavController()
{
Thread.Sleep(500);
ForceCloseAtBeginning();
Application.Exit();
}
private void ForceCloseAtBeginning()
{
DialogResult dlgResult =
MessageBox.Show("STK application not running. UavController will now close.", "Closing...",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
该线程用于确保在尝试退出之前完全初始化WinForm。这对我来说似乎是不好的做法......我怎样才能更好地实现这样的功能呢?
答案 0 :(得分:2)
您应该为您的应用程序实现自己的Main方法。在项目设置中,告诉应用程序使用此方法,而不是启动表单。
在此Main方法中,您将检查外部应用程序是否正在运行,如果是,则运行Form。
示例:
static void Main()
{
if (!ControlFacade.CheckIfStkIsLaunched())
{
DialogResult dlgResult =
MessageBox.Show("STK application not running. UavController will now close.", "Closing...",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
Application.Exit();
return;
}
Application.Run(new UavControlForm());
}
答案 1 :(得分:1)
我会提取检查STK应用程序是否正在运行到表单之外的逻辑,并且仅在应用程序运行时初始化表单。
但是如果你试图确保表单在关闭之前完全初始化,那么要么覆盖表单的关闭事件,要么挂钩它,如果STK应用程序没有运行,则取消关闭。
protected override void OnClosing(CancelEventArgs e) {
if (!ControlFacade.CheckIfStkIsLaunched()) {
e.Cancel = true;
}
base.OnClosing(e);
}
答案 2 :(得分:0)
为什么不在表单中覆盖OnLoad方法然后进行检查?