如何在 WinForms MDI 环境中正确实现 CloseAllForms()?
How to correctly implement CloseAllForms() in WinForms MDI environment?
我测试了多种关闭所有MDI子窗体的方法,但它们似乎不稳定。在很多情况下,我会得到 ObjectDisposedException
.
我尝试了什么:
'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
。
- 运行 从 last 到 0 的索引崩溃的概率更高。
Microsoft 的 - While-loop-based trick(在实时集合上运行,成功时保持索引不变)也以同样的方式崩溃。
- 如果我为
f.Disposing
和 f.IsDisposed
插入测试,则没有任何改善。
如何以稳定的方式关闭所有打开的表单?
(如果要摘录一些代码,可以选择C#或者VB.NET。)
我找到问题了。窗体调用 CloseAllForms()
试图在关闭所有窗体(包括其自身)后操作其控件。检查 Disposing Or IsDisposed
表达式有助于避免该问题。
我将继续使用 closing approach shown by Microsoft,即不创建表单集合的副本,而是迭代实时集合并仅在某些表单必须从关闭中排除(或无效)时才增加索引。
另一方面,我相信问题中提到的其他方法几乎是等效的。正如我发现的那样,问题出在其他地方。
我测试了多种关闭所有MDI子窗体的方法,但它们似乎不稳定。在很多情况下,我会得到 ObjectDisposedException
.
我尝试了什么:
'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
。 - 运行 从 last 到 0 的索引崩溃的概率更高。 Microsoft 的
- While-loop-based trick(在实时集合上运行,成功时保持索引不变)也以同样的方式崩溃。
- 如果我为
f.Disposing
和f.IsDisposed
插入测试,则没有任何改善。
如何以稳定的方式关闭所有打开的表单?
(如果要摘录一些代码,可以选择C#或者VB.NET。)
我找到问题了。窗体调用 CloseAllForms()
试图在关闭所有窗体(包括其自身)后操作其控件。检查 Disposing Or IsDisposed
表达式有助于避免该问题。
我将继续使用 closing approach shown by Microsoft,即不创建表单集合的副本,而是迭代实时集合并仅在某些表单必须从关闭中排除(或无效)时才增加索引。
另一方面,我相信问题中提到的其他方法几乎是等效的。正如我发现的那样,问题出在其他地方。