C# 同じフォームの表示、非表示を繰り返すと発生する例外の回避の仕方
お世話になります。
ミニゲームを作ろうとしています。
簡単な勝ち負けのフォームを繰り返すだけの処理なんですが、
それを自動化しようと、『フォームがアクティブ化されたらボタンを押される』
のような処理でテストしていたら、図の様なエラーが発生しました。
30回ほど繰り返すと発生するみたいですが、performClickを外して、
手動で行っている分には発生しません。
対策方法を教えてください。
下記に、全ソースを記述します。
using System;
using System.Windows.Forms;
namespace Formest
{
public partial class Form1 : Form
{
/** フォーム1 ただフォーム2をボタンで表示するだけ */
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog(this);
}
}
}
using System;
using System.Windows.Forms;
namespace Formest
{
/** フォーム3を呼び出す為のフォーム。ここで自動化を行っている。 */
public partial class Form2 : Form
{
private const int WIN = 1;
private const int LOSE = -1;
private Form3 f3 = new Form3();
private int win = 0;
public Form2()
{
InitializeComponent();
}
private void Form2_Activated(object sender, EventArgs e)
{
this.Text = "" + this.win;
// ↓自動化している。コメントアウトして手動でカチカチすれば正しく動く。
this.button1.PerformClick();
}
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
if (this.process() == LOSE)
{
this.Show();
MessageBox.Show("残念。" + this.win + "連勝まで行きました。");
this.Close();
}
else
{
this.Show();
this.Activate();
}
}
private int process()
{
// ここで例外発生
DialogResult ans = this.f3.ShowDialog(this);
// 勝った場合
if (ans == DialogResult.Yes)
{
this.win++;
return WIN;
}
// 負けた場合
else if (ans == DialogResult.No)
{
return LOSE;
}
return 0;
}
}
}
using System;
using System.Windows.Forms;
namespace Formest
{
public partial class Form3 : Form
{
/* 仮の戦闘シーン。今は乱数で勝敗を分けているだけ。 */
public Form3()
{
InitializeComponent();
}
private void Form3_Shown(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(50);
Random rnd = new Random();
int i = rnd.Next(256);
if (i == 0)
{
this.DialogResult = DialogResult.No;
}
else
{
this.DialogResult = DialogResult.Yes;
}
}
}
}
以上です。
Form2にあるボタンをクリックすれば戦闘が始まる感じです。
よろしくお願いいたします。