私は、非同期操作を組み込んだアプリケーションを作成して、多数の項目をループし、各項目の計算時間を長くします。ユーザー入力用のモーダルダイアログをポップアップします。面白いことに、私は今日、このアプリケーションを実行している間に、モーダルダイアログが何らかの形で親フォームを取得していることに気付きました。アプリケーションにモーダルブロックを提供するのではなく、ダイアログがDigsbyチャットウィンドウを親として取得しました。C#フォームアプリケーション - モーダルダイアログに間違った親があります
Digsbyウィンドウが完全にブロックされたため、最初のダイアログと同じ時間にポップアップされたDigsbyウィンドウが作成されました(おそらくまったく同じ時刻です)。非同期操作が完了しました。どのようにプロセス単位のスレッドが機能するかを考えると、これがどのように可能かはわかりませんが、確かに起こりました。このようなバグの原因は何ですか?アプリケーションはC#.NET 3.5で、Windows XP上で実行されるWindowsフォームがあります。
はここで一言で言えば、非同期コードです:あなたはProgressBar
アップデートを起動しているのと同じように
Action<List<ClubListing>> a = delegate(List<ClubListing> list)
{
for (int i = 0; i < list.Count; i++)
{
var cl = list[i];
if (cl.MatchingClubListing == null)
{
var compare = CompareNames(cl.Club.Name);
if (compare.Any(c => c.Value == 0 && c.Key.Club.State == cl.Club.State))
{
var match = compare.First(c => c.Value == 0 && c.Key.Club.State == cl.Club.State);
compareDialog.ClubA = cl.Club;
compareDialog.ClubB = match.Key.Club;
DialogResult dr = compareDialog.ShowDialog();
if (dr == DialogResult.Yes)
{
cl.MatchingClubListing = match.Key;
match.Key.MatchingClubListing = cl;
}
else if (dr == DialogResult.Abort)
{
break;
}
}
}
this.Invoke(new MethodInvoker(delegate()
{
this.prbOperationProgress.Value = i;
}));
}
};
AsyncCallback callback = new AsyncCallback(SaveAndUpdate);
var result = a.BeginInvoke(this.lbxLiveClubs.Items.Cast<ClubListing>().ToList(), callback, null);
これは、引数がないShowDialog()のドキュメントでは、「現在アクティブなウィンドウはダイアログボックスの所有者になります。特定の所有者を指定する場合は、この方法のもう一つのバージョンです。 http://msdn.microsoft.com/en-us/library/c7ykbedk.aspxを参照してください。 –