我应该处置HtmlElement实例吗?

时间:2013-07-04 10:49:17

标签: winforms webbrowser-control dispose

在WinForms中,WebBrowser控件在Document类型中具有HtmlDocument属性。 HtmlDocument实例具有返回Forms个实例的LinksGetElementsByTagName()HtmlElementCollection等属性/方法。当我迭代HtmlElementCollection时,我收到了HtmlElement个实例。这些HtmlElement实例具有DomElement属性,这是对底层COM对象的引用。我的问题是,我应该在这些Marshal.ReleaseComObject()实例上调用HtmlElement方法,还是WinForms在内部管理引用?

2 个答案:

答案 0 :(得分:4)

手动内存管理总是一个坏主意,尤其是COM对象。您可以从专家处获得有关它的意见,Visual Studio团队的blog post可以很好地回归。

如果您仍然认为这是一个好主意,Winforms团队已经为您做出了决定。由HtmlDocument,HtmlElement,HtmlWindow,HtmlElementCollection等类包装的接口指针是该类的私有变量。你根本无法做到这一点,无论如何都不能打破书中的每一条规则。

问题并非完全不可能,这些包装类对象非常小,因此可能出现问题,垃圾收集器运行频率不足以确保释放基础COM对象。 GC.Collect()是后备的。只在必要时使用它。

答案 1 :(得分:1)

如果不调用ReleaseComObject函数,winforms会自动释放这些对象。 Msdn说它可以用来控制对象的生命周期,但没有必要。

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx