C#/Winform,为什么子窗口自动定时关闭后,主窗口弹出的MessageBox也自动关了?

看图:

启动调试,点击按钮,会同时弹出form2和messagebox,但按照一般的理解messagebox只有用户点击才会关闭,现实情况是关了。
请解释其原因,不是要解决方法,是合理原因。

当你打开messagebox的时候没有指定其owner,那么当前的活动窗口会被自动设置为其owner。在你的代码中,打开的信息框的owner即是form2.因此,当你的form2关闭时,所属的messagebox作为一个子窗口也将会被自动关闭。
而form则不会有此影响,因为form都是顶级窗口,它没有owner,所以不会互相影响。
要避免此问题,可以在Show消息框的时候指定一个owner,比如 MessageBox.Show(this ,"test message"),你就会看到这个消息框不会随着Form2的关闭而关闭了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-29
这种类型的项目,都会分“前台线程”和“后台线程”的,意思就是,你的主窗体占用着主线程,主窗体关闭,所有属于它的子级全都会被关闭。打个比方说,你这个软件开启了,显示出界面了,然后有个播放歌曲的任务被你执行,然后你把主窗体关闭,理应的结果是歌曲也会被停止,不然就乱套了。追问

你没看清楚代码吧,自动关闭的是子窗口。而你回答的是“主窗体关闭,所有属于它的子级全都会被关闭”。主窗口直到最后都一直开着,何来主窗体关闭一说?

追答

因为“模态框”这个东西,有一个Owner这个概念,你先启动的是win2,再启动的是提示框,而提示框就是模态框的一种,他会寄宿在当前active(活动的)的窗体上,也就是刚因Show()方法而被激活的win2,于是宿主就是win2……

追问

迟了。采纳那个更高点。