构造函数中的线程......糟糕的做法?

时间:2011-02-08 01:21:19

标签: c# winforms

我有一些事情......

    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。这对我来说似乎是不好的做法......我怎样才能更好地实现这样的功能呢?

3 个答案:

答案 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方法然后进行检查?