C# 构造函数中的线程。。。坏习惯?

C# 构造函数中的线程。。。坏习惯?,c#,winforms,C#,Winforms,我有一些类似于 private UavControlForm() { InitializeComponent(); if (ControlFacade.CheckIfStkIsLaunched()) { _controlFacade = new ControlFacade(); SubscribeToStkQuit(); } else

我有一些类似于

    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在尝试退出之前已完全初始化。这对我来说似乎是个坏习惯。。。如何更好地实现此类功能?

我将提取检查STK应用程序是否在表单外部运行的逻辑,并仅在应用程序正在运行时初始化表单

但是,如果您试图确保表单在关闭之前完全初始化,则可以覆盖表单的关闭事件或钩住它,并在STK应用程序未运行时取消关闭

protected override void OnClosing(CancelEventArgs e) {
    if (!ControlFacade.CheckIfStkIsLaunched()) {
        e.Cancel = true;
    }
    base.OnClosing(e);
}

为什么不重写表单中的OnLoad方法,然后进行检查?

您应该为应用程序实现自己的Main方法。在项目设置中,告诉应用程序使用此方法,而不是启动表单

在这个主方法中,您将检查外部应用程序是否正在运行,如果正在运行,则运行表单

例如:

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());
}

我认为他希望确保表单在关闭之前准备好加载。如果表单在OnLoad事件之前关闭,重写OnLoad方法对他没有帮助。我认为表单在加载之前无法关闭。@Richard Schneider的+1。在消息队列完全加载之前,表单不会处理它(除非您从表单_Load进入DoEvents())。来自用户的任何“关闭”消息/操作都将以SendMessage的形式由Windows放入消息队列,并且在表单完全加载之前,GUI线程(在应用程序的任何部分)不会对其进行处理。@WulfgarPro:很高兴提供帮助!威尔提供了一个我在下面建议的例子。