2011-02-08 147 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()); 
}