我遇到了问题,不知道如何解决。我有一个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方法的标题中得到上面提到的异常。为什么呢?
答案 0 :(得分:0)
好吧这可能不是最好的方法,但我现在解决了这个问题。我只需将代码放在他创建Thread的位置,显示表单并将表单隐藏到我的Form1中。这可以防止他在第二次打开表单时崩溃。