在初始化表单(主表单)时,它调用另一个表单来获取一堆启动输入,然后传输大量信息:
Form3 getup = new Form3();
getup.Show();
example = getup.example;
但是,我需要等待这个新的表单信息完成。
Form3 getup = new Form3();
getup.Show();
waitfordone();
example = getup.example;
ATM,我尝试过使用while语句:
Form3 getup = new Form3();
getup.Show();
While(getup.visible=true)Console.WriteLine("waiting");
example = getup.example;
但是这会导致挂起...也就是说,它会运行,然后冻结。我怀疑这是因为while循环正在吃掉所有的处理。所以,我尝试制作一个新线程
Form3 getup = new Form3();
Thread t = new Thread(getup.Show());
t.start();
While(getup.visible=false)Console.WriteLine("waiting"); // takes a little bit to open
While(getup.visible=true)Console.WriteLine("waiting"); //waits for close
example = getup.example;
但这也会导致它挂起。也许出于同样的原因。我已经研究过autoresetevents。
我试过了:
AutoResetEvent invisible = new AutoResetEvent(false);
Form3 getup = new Form3();
void setup_invisible(object sender, EventArgs e)
{
if (getup.Visible == false) invisible.Set();
}
public ... {
getup.VisibilityChanged += new EventHandle(setup_Invisible);
getup.show();
invisible.WaitOne();
... }
// and many other variations on this
但是,唉,它打开form3,关闭它(因为线程已完成?),然后挂起invisible.WaitOne();
有人可以解释一下如何做到这一点,阅读只会让我更加困惑。
答案 0 :(得分:11)
您可能需要的是对话框。
Form3 getup = new Form3();
getup.ShowDialog();
example = getup.example;
这将暂停执行,只有在表单关闭后才会继续。
答案 1 :(得分:1)
你想要使用事件:
Form3 getup = new Form3();
getup.Show();
getup.FormClosing += (sender, args) =>
{
example = getup.example;
}
当前方法立即完成是很重要的,这样UI线程就可以继续使用它的循环。通过附加到事件处理程序,您可以确保在需要时运行代码。 “等待儿童形式关闭”的整个概念本质上与winforms的设计背道而驰。
您也可以将表单设为对话框弹出窗口。
Form3 getup = new Form3();
getup.ShowDialog();
example = getup.example;
这样可以正常工作,不会意外冻结。