C#表单应用程序 - 模态对话框有错误的父级

时间:2009-03-26 15:14:41

标签: c# multithreading winforms windows-xp

我有一个内置异步操作的应用程序,它循环遍历大量项目并对每个项目执行冗长的计算,因为这种情况会导致应用程序弹出用户输入的模态对话框。有趣的是,我注意到今天运行这个时,在一个应用程序实例中,模态对话框以某种方式得到了错误的父表单 - 而不是向我的应用程序提供模态块,对话框已经将Digsby聊天窗口作为其父级。

他们成为孩子的Digsby窗口在创建第一个对话框的同时弹出(可能是完全相同的时间)并且看起来他们的线程以某种方式相互交叉,因为Digsby窗口被完全阻挡,直到异步操作完成。考虑到每个进程的线程如何工作,我不知道这是怎么可能的,但它确实发生了。什么会导致这样的错误?顺便说一下,该应用程序是C#.NET 3.5,在Windows XP上运行Windows窗体。

简而言之,这是异步代码:

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

3 个答案:

答案 0 :(得分:3)

将父对话框添加为compareDialog.ShowDialog()的参数。例如:

Form parent = ...;
compareDialog.ShowDialog(parent);

答案 1 :(得分:0)

就像您正在调用ProgressBar更新一样,您需要Invoke()显示对话框。

答案 2 :(得分:0)

看起来您正在工作线程中显示比较对话框。如果您使用Invoke来调用对话框,我认为您可能没问题。