Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#表单应用程序-模态对话框的父级错误_C#_Multithreading_Winforms_Windows Xp - Fatal编程技术网

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

C#表单应用程序-模态对话框的父级错误,c#,multithreading,winforms,windows-xp,C#,Multithreading,Winforms,Windows Xp,我有一个应用程序,它内置了一个异步操作,在大量项目上循环,并对每个项目执行冗长的计算,因为这种情况发生时,某些条件会导致应用程序弹出一个模式对话框供用户输入。有趣的是,我注意到,在今天运行此程序时,在一个应用程序实例中,模态对话框不知何故得到了错误的父窗体-对话框没有为我的应用程序提供模态块,而是将Digsby聊天窗口作为其父窗体 他们成为其子对象的Digsby窗口大约在创建第一个对话框的同一时间(可能正好在同一时间)弹出,看起来他们的线程以某种方式相互交叉,因为Digsby窗口在异步操作完成之

我有一个应用程序,它内置了一个异步操作,在大量项目上循环,并对每个项目执行冗长的计算,因为这种情况发生时,某些条件会导致应用程序弹出一个模式对话框供用户输入。有趣的是,我注意到,在今天运行此程序时,在一个应用程序实例中,模态对话框不知何故得到了错误的父窗体-对话框没有为我的应用程序提供模态块,而是将Digsby聊天窗口作为其父窗体

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

以下是简单的异步代码:

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);
动作a=委托(列表)
{
for(int i=0;ic.Value==0&&c.Key.Club.State==cl.Club.State))
{
var match=compare.First(c=>c.Value==0&&c.Key.Club.State==cl.Club.State);
比较ALOG.ClubA=cl.Club;
compareDialog.ClubB=match.Key.Club;
DialogResult dr=compareDialog.ShowDialog();
如果(dr==DialogResult.Yes)
{
cl.MatchingClubListing=match.Key;
match.Key.MatchingClubListing=cl;
}
else if(dr==DialogResult.Abort)
{
打破
}
}
}
this.Invoke(newmethodinvoker(delegate())
{
this.prboOperationProgress.Value=i;
}));
}
};
AsyncCallback=新的AsyncCallback(保存和更新);
var result=a.BeginInvoke(this.lbxLiveClubs.Items.Cast().ToList(),回调,null);

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

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

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


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


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

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

答案是,无参数ShowDialog()的文档说:“……当前活动窗口成为对话框的所有者。如果您想指定特定所有者,请使用此方法的其他版本。”查看这是答案的原因是,无参数ShowDialog()的文档说:“……当前活动窗口成为对话框的所有者。如果要指定特定所有者,请使用此方法的其他版本。”请参阅
Form parent = ...;
compareDialog.ShowDialog(parent);