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:很高兴提供帮助!威尔提供了一个我在下面建议的例子。