2011-02-08 149 views
2

我沿着线的东西..构造函数中的线程...不好的做法?

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试图退出之前完全初始化。这对我来说似乎是不好的做法...我怎么能更好地实现这样的功能?

回答

1

我将提取检查STK应用程序是否正在运行的形式之外,并且如果应用程序正在运行仅初始化的形式的逻辑。

但是,如果你想确保表单完全初始化它关闭之前,然后要么重写窗体的关闭事件或钩住它,并取消closing如果STK应用程序没有运行。

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

@WulfgarPro:很乐意帮忙!将提供一个我以下建议的例子。 – bitxwise 2011-02-08 01:43:42

0

为什么不直接覆盖窗体中的OnLoad方法,然后执行检查?

+0

我认为他希望确保表格在允许关闭前准备好加载。如果表单在OnLoad事件之前关闭,则重写OnLoad方法将无助于他。 – bitxwise 2011-02-08 01:39:34

+1

我不认为表单可以在加载前关闭。 – 2011-02-08 02:43:33

2

你应该为应用程序实现自己的主要方法。在项目设置中,告诉应用程序使用此方法,而不是启动窗体。

在这个主要方法,你会执行检查的外部应用程序是否在运行,如果是的话 - 然后运行该窗体。

例子:

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