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;

しかし、これはハングアップの原因にもなります。おそらく同じ理由で。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();

誰かがこれを行う方法を説明してもらえますか、読むことは私をより混乱させるだけです.

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 スレッドがループを続行できるように、現在のメソッドがすぐに終了することが重要です。イベント ハンドラーにアタッチすることで、コードが必要なときに実行されるようになります。「子フォームが閉じるのを待つ」という概念全体は、本質的に winform の設計に反します。

フォームをダイアログ ポップアップにすることもできます。

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

それは問題なく機能し、意図しないフリーズはありません。

于 2012-08-17T14:20:56.597 に答える