从线程关闭窗体

本文关键字:窗体 线程 | 更新日期: 2023-09-27 18:26:00

我有一个线程,它以我的主窗体开始

    private void changePasswordbutton_Click_1(object sender, EventArgs e)
    {
        waitForm.Show();
        Thread thread = new Thread(ProcessInkPresenter);
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();
        waitForm.Hide();
        waitForm.Dispose();
    }

我想关闭ProcessInkPresenter方法(在线程上运行)中的waitForm,而不是等待线程完成。

我该怎么做?

感谢

方法签名

private void ProcessInkPresenter()

在类标题中定义

Wait waitForm;

从线程关闭窗体

您的原始代码没有意义。它显示一个表单,然后启动一个线程,然后等待该线程完成。如果你想让表单在它自己的UI线程上运行,让ProcessInkPresenter在同一个UI线程上(如果它与UI交互,应该是这样)运行,并关闭表单,并在ProcessInkPresenter完成时处理掉,请尝试以下操作:

private void changePasswordbutton_Click_1(object sender, EventArgs e)
{
    Thread thread = new Thread(state => {
            using (var waitForm = new WaitForm()) {
                waitForm.Activated += (s, e) => {
                    ProcessInkPresenter();
                    waitForm.Hide();
                }
                Application.Run(waitForm);
            }
        }
    );
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

如果工作线程不必与GUI交互,那么您需要的内容如下所示。请注意,我使用Invoke来确保与UI的交互是在UI线程上完成的。这里不需要检查InvokeRequired,因为我已经确定我在后台线程上了。

如果你想保留相同的waitForm实例:

private void changePasswordbutton_Click_1(object sender, EventArgs e)
{
    Thread thread = new Thread(state => {
            try {
                ProcessInkPresenter();
                // If ProcessInkPresenter fails, this line will never execute
                waitForm.Invoke(new Action(()=>waitForm.Hide()));
            }
            catch (Exception ex) {
                // You probably want to do something with ex here,
                // rather than just swallowing it.
            }
        });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    waitForm.Show();
}

注意:如果您只有一个WaitForm实例(Wait实例),那么处理它是没有意义的。每次使用实例时都构造一个实例,或者从不处理它,而是使用.Hide()