.net 如何在WinForms MDI环境中正确实现CloseAllForms()?

.net 如何在WinForms MDI环境中正确实现CloseAllForms()?,.net,winforms,mdi,.net,Winforms,Mdi,我已经测试了多种关闭所有MDI子窗体的方法,但它们似乎不稳定。在许多情况下,我会得到ObjectDisposedException 我尝试的是: “收集应用程序表单数组的副本” Dim formsToClose As Form()=My.Application.OpenForms.OfType(Of Form.ToArray()) '迭代集合,跳过特殊表单 对于整数形式的i=LBound(formsToClose)+1到UBound(formsToClose) 尺寸f作为形式=形式关闭(i) 如

我已经测试了多种关闭所有MDI子窗体的方法,但它们似乎不稳定。在许多情况下,我会得到
ObjectDisposedException

我尝试的是:

“收集应用程序表单数组的副本”
Dim formsToClose As Form()=My.Application.OpenForms.OfType(Of Form.ToArray())
'迭代集合,跳过特殊表单
对于整数形式的i=LBound(formsToClose)+1到UBound(formsToClose)
尺寸f作为形式=形式关闭(i)
如果f为Nothing或LSE FRM Special.IsMyInstance(f),则继续
尝试
clsWinForms.ForceCloseForm(f)
特例
“这里有一些代码
结束尝试
接下来我
ForceCloseForm()
在关闭表单验证后执行
Form.Close()

  • 这种方法会随机与
    ObjectDisposedException
    崩溃
  • 从最后一个索引运行到0崩溃的概率更高
  • 微软(在live collection上运行,成功后保持索引不变)也以同样的方式崩溃
  • 如果我为
    f.disposed
    f.IsDisposed
    插入测试,则没有任何改进
如何以稳定的方式关闭所有打开的窗体


(如果您想提供一些代码摘录,可以选择C#或VB.NET。)

我发现了这个问题。表单调用
CloseAllForms()
试图在所有表单(包括自身)关闭完成后操作其控件。检查
disposed或IsDisposed
表达式有助于避免该问题

我将继续,也就是说,不创建表单集合的副本,只在某些表单必须从关闭中排除(或无效)时,才在live集合上迭代并增加索引

另一方面,我认为问题中提到的其他方法几乎是相同的。我发现问题出在别处