我使用以下函数关闭现有表单并打开一个新表单。 我有一个以线程运行的函数,总是在后台运行。 当我从线程中的函数调用下面的函数时,线程没有执行它 之后的工作。可能是线程正在流产。如何解决这个问题。感谢。
static public void NewMainForm(Form main, bool ClosePreviousMain)
{
if (main != null)
{
Global.ActiveForm = main.Text;
if (ClosePreviousMain & MyContext.curMain != null)
{
MyContext.curMain.FormClosed -= new FormClosedEventHandler(main_FormClosed);
if (Application.OpenForms.Count > 0)
{
MyContext.curMain.Invoke(new Action(MyContext.curMain.Dispose));
}
}
MyContext.curMain = main;
MyContext.curMain.FormClosed += new FormClosedEventHandler(main_FormClosed);
MyContext.curMain.ShowDialog();
}
}
答案 0 :(得分:1)
运行应用程序时,运行时会创建一个主(前台)线程并开始执行应用程序的入口点,即Main方法。
在GUI应用程序中,当main方法执行时,它启动一个名为EDT(事件调度线程)的线程,另一个主(前台)线程,然后你的主线程退出(如果它没有任何关系)。但是,应用程序一直运行,直到单个主(前台)线程处于活动状态。
您正在执行的方法是后台线程(如您所述)当GUI退出时(关闭表单之后)所有主(前台)线程都已死亡,因此您的应用程序将死亡。您需要做的是将后台工作线程作为前台线程运行,以便前台线程创建的所有线程默认为前台线程,后台线程创建的线程默认为后台线程。
因此,要么加入主线程以等待后台线程终止(在这种情况下,您需要实现一种方法来停止后台线程)。或者将后台线程作为前台线程运行。