关闭表单后,“从其创建的线程以外的线程访问”

时间:2015-03-25 14:10:00

标签: c# multithreading winforms invoke

我遇到了问题,不知道如何解决。我有一个Form2,我通过单击按钮从我的Form1打开。 在这个表单2中,我在ListView上做了一些操作。当操作在后台运行时,我想显示另一个在那段时间打开的表单(Form3)。所以我做了以下事情:

public void method()
 {
  Form3 form3 = Form3.GetInstance();

        if (thrd == null)
        {
            thrd = new Thread(new ThreadStart(showForm));
            thrd.IsBackground = true;
            thrd.Start();
        }

        else
        {
            if (form3.InvokeRequired)
            {
                form3.Invoke((MethodInvoker)delegate()
                {
                    form3.Show();
                }
                );
            }
            else
            {
                form3.Show();
            }
        }

     //some operations getting invoked

        if (form3.InvokeRequired)
            {
                form3.Invoke((MethodInvoker)delegate()
                {
                    form3.Hide();
                }
                );
            }
            else
            {
                form3.Hide();
            }
}


   private void showForm()
    {
        Form3 form3 = Form3.GetInstance();
        Application.Run(Form3.GetInstance());
    }

Form3中的代码:

    private static Form3 m_instance = null;
    private static object m_instanceLock = new object();

    public static Form3 GetInstance()
    {

        lock (m_instanceLock)
        {
            if (m_instance == null)
            {
                m_instance = new Form3();
            }
        }

        return m_instance;
    }

因此,当我打开Form2并完成我的工作时,一切正常。当我调用需要更长时间的操作时,Form3会在操作完成时显示和关闭。但是,当我关闭我的Form2,然后再次打开它(没有关闭Form1),然后我在Application.Run方法的标题中得到上面提到的异常。为什么呢?

1 个答案:

答案 0 :(得分:0)

好吧这可能不是最好的方法,但我现在解决了这个问题。我只需将代码放在他创建Thread的位置,显示表单并将表单隐藏到我的Form1中。这可以防止他在第二次打开表单时崩溃。