Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由于关闭窗体的函数而导致线程中止_C#_Multithreading - Fatal编程技术网

C# 由于关闭窗体的函数而导致线程中止

C# 由于关闭窗体的函数而导致线程中止,c#,multithreading,C#,Multithreading,我正在使用以下功能关闭现有表单并打开新表单。 我有一个作为线程运行的函数,它总是在后台运行。 当我从线程中的函数调用下面的函数时,线程没有执行它的任务 在那之后工作。可能是线程正在中止。如何解决这个问题。谢谢 static public void NewMainForm(Form main, bool ClosePreviousMain) { if (main != null) { Global.ActiveForm = main.Text; if (Close

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

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

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

在GUI应用程序中,当main方法执行时,它会启动一个名为EDT(事件调度线程)的线程,另一个主(前台)线程和您的主线程在此之后退出(如果它与此无关)。但是,应用程序会一直运行,直到单个主(前台)线程处于活动状态

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


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

也许它不会中止。你应该试着找出答案。如果你发布你的线程函数代码以及线程创建和启动代码,这会容易得多。对于线程来说,代码非常大,不能在这里发布。顺便说一下,你可以将thread.IsBackground属性设置为[真或假]使其成为背景线程。在开始线程之前,设置thread.IsBackground=false;然后检查。