线程因为关闭表单的函数而中止

时间:2009-07-13 03:54:34

标签: c# multithreading

我使用以下函数关闭现有表单并打开一个新表单。 我有一个以线程运行的函数,总是在后台运行。 当我从线程中的函数调用下面的函数时,线程没有执行它 之后的工作。可能是线程正在流产。如何解决这个问题。感谢。

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

1 个答案:

答案 0 :(得分:1)

运行应用程序时,运行时会创建一个主(前台)线程并开始执行应用程序的入口点,即Main方法。

在GUI应用程序中,当main方法执行时,它启动一个名为EDT(事件调度线程)的线程,另一个主(前台)线程,然后你的主线程退出(如果它没有任何关系)。但是,应用程序一直运行,直到单个主(前台)线程处于活动状态。

您正在执行的方法是后台线程(如您所述)当GUI退出时(关闭表单之后)所有主(前台)线程都已死亡,因此您的应用程序将死亡。您需要做的是将后台工作线程作为前台线程运行,以便前台线程创建的所有线程默认为前台线程,后台线程创建的线程默认为后台线程。

因此,要么加入主线程以等待后台线程终止(在这种情况下,您需要实现一种方法来停止后台线程)。或者将后台线程作为前台线程运行。