8

在初始化一个表单(主表单)时,它会调用另一个表单来获取一堆起始输入,然后传递大量信息:

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;

但这也会导致它挂起。也许出于同样的原因。我研究了自动重置事件。

我试过了:

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

有人可以解释一下如何做到这一点,阅读只会让我更加困惑。

4

2 回答 2

11

您可能需要一个对话框。

Form3 getup = new Form3();
getup.ShowDialog();
example = getup.example;

这将暂停执行,并且仅在表单关闭后继续执行。

于 2012-08-17T14:20:47.470 回答
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;

这将工作得很好,不会意外冻结。

于 2012-08-17T14:20:56.597 回答