Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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#_.net_Multithreading_Forms - Fatal编程技术网

C# 关闭表单后打开表单会导致崩溃

C# 关闭表单后打开表单会导致崩溃,c#,.net,multithreading,forms,C#,.net,Multithreading,Forms,基本上,这段代码应该在一个线程中打开一个加载表单,并在另一个线程中执行一些其他进程 但是,如果在加载表单后关闭一次加载表单并再次按下“发送”按钮,我的应用程序就会崩溃。它说要确保表单仍然存在,如果没有发布。所以在惊人的加载中,我只是检查我的表单是否为“null”。它从不去其他地方。如果我加载表单=新加载();在没有其他任何东西的情况下开始加载时,它将打开表单并停留在那里,永远不会关闭。closeLoading是从第二个线程中的进程调用的 我怎样才能解决这个问题?我不断收到错误,以确保我的表单没有

基本上,这段代码应该在一个线程中打开一个加载表单,并在另一个线程中执行一些其他进程

但是,如果在加载表单后关闭一次加载表单并再次按下“发送”按钮,我的应用程序就会崩溃。它说要确保表单仍然存在,如果没有发布。所以在惊人的加载中,我只是检查我的表单是否为“null”。它从不去其他地方。如果我加载表单=新加载();在没有其他任何东西的情况下开始加载时,它将打开表单并停留在那里,永远不会关闭。closeLoading是从第二个线程中的进程调用的

我怎样才能解决这个问题?我不断收到错误,以确保我的表单没有发布

编辑:

我不知道我是否足够清楚


最后一部分工作。因此,如果我打开加载表单一次,然后在完成后关闭它。碰撞部分发生在我第二次打开加载表单之后。上面写着这样的信息

我没有使用线程,而是使用了任务,并将加载屏幕作为对话框打开,以防止与主窗体交互

Loading loadingForm = new Loading();
        private void btnSend_Click(object sender, EventArgs e)
        {
            Thread loading = new Thread(new ThreadStart(startLoading));
            loading.Start();
            new Thread(() => sendEmail()
            ).Start();
        }
        public void closeLoading()
        {
            if (loadingForm.InvokeRequired)
                loadingForm.Invoke((MethodInvoker)delegate ()
                {
                    closeLoading();
                });
            else
                loadingForm.Close();
        }
        public void startLoading()
        {
            if (loadingForm != null)
                Application.Run(loadingForm);
            else
            {
                loadingForm = new Loading();
                Application.Run(loadingForm);
            }
        }

您不希望有多个UI线程。你真的应该有一个UI线程来处理你的整个UI。你尝试重用
loadingForm
变量是没有意义的。这段代码也非常危险,您需要进行调试。那是为了吓唬你不要这么做。工作线程只能调用sendEmail(),而不能调用其他内容。使用BackgroundWorker,它的RunWorkerCompleted事件可以方便地关闭窗口。只要在代码中维护对loadingForm的引用,垃圾收集器就不会释放它。您应该隐藏表单,或者在处理表单后将表单设置为null。谢谢,这样就可以了:)
Loading loadingForm = new Loading();
btnSend_Click(object sender, EventArgs e)
{
    new Task(() => sendEmail()
    ).Start();
    startLoading();
}
public void closeLoading()
{
    if (loadingForm.InvokeRequired)
    {
        loadingForm.Invoke((MethodInvoker)delegate()
        {
            closeLoading();
        });
    }
    else
    {
        loadingForm.Hide();
    }
}
private void startLoading()
{
    if (loadingForm == null)
    {
        loadingForm = new Loading();
    }
    loadingForm.ShowDialog();
}


private void sendEmail()
{
    Thread.Sleep(1000);
    closeLoading();
}