从线程关闭表单

时间:2012-02-27 17:18:18

标签: c# .net winforms multithreading c#-4.0

我有一个以我的主要形式开始的线程

    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;

1 个答案:

答案 0 :(得分:2)

您的原始代码没有意义。它显示一个表单,然后启动一个线程,然后等待该线程完成。如果您希望表单在其自己的UI线程上运行,请让ProcessInkPresenter在相同的UI线程上运行(如果它与UI交互,它应该运行)并使表单关闭并在{{1完成,试试这个:

ProcessInkPresenter

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

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

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

注意:如果你有一个单一的实例(你的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