0
我已经测试了多种方法来关闭所有的MDI子窗体,但它们似乎不稳定。在很多情况下,我会得到ObjectDisposedException
。如何在WinForms MDI环境中正确实现CloseAllForms()?
我试了一下:
'collect copy of app forms array
Dim formsToClose As Form() = My.Application.OpenForms.OfType(Of Form).ToArray()
'iterate over collection, skip special forms
For i As Integer = LBound(formsToClose) + 1 To UBound(formsToClose)
Dim f As Form = formsToClose(i)
If f Is Nothing OrElse frmSpecial.IsMyInstance(f) Then Continue For
Try
clsWinForms.ForceCloseForm(f)
Catch ex As Exception
'some code here
End Try
Next i
ForceCloseForm()
确实Form.Close()
它关闭后表单验证。
- 这种方法随机崩溃
ObjectDisposedException
。 - 运行索引从最后到0崩溃的概率更高。来自微软的
- While-loop-based trick(在live collection上运行,保持索引在成功上不变)也以同样的方式崩溃。
- 如果我插入测试
f.Disposing
和f.IsDisposed
,没有任何改善。
如何以稳定的方式关闭所有打开的窗体?
(如果你想给一些代码片段,您可以选择C#或VB.NET)