- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我公司,发布 Excel Interop 对象的常用方法是按以下方式使用 IDisposable
:
Public Sub Dispose() Implements IDisposable.Dispose
If Not bolDisposed Then
Finalize()
System.GC.SuppressFinalize(Me)
End If
End Sub
Protected Overrides Sub Finalize()
_xlApp = Nothing
bolDisposed = True
MyBase.Finalize()
End Sub
_xlApp
是在构造函数中按以下方式创建的:
Try
_xlApp = CType(GetObject(, "Excel.Application"), Excel.Application)
Catch e As Exception
_xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
End Try
并且客户端使用using-statement
来执行与excel互操作对象有关的代码。
我们完全避免使用 two dot rule .现在我开始研究如何发布 (Excel) 互操作对象以及我发现的几乎所有关于它的讨论,如 How to properly clean up excel interop objects或 Release Excel Objects主要使用 Marshal.ReleaseComObject()
,没有一个使用 IDisposable
接口(interface)。
我的问题是:使用 IDisposable
接口(interface)释放 excel 互操作对象有什么缺点吗?如果是这样,这些缺点是什么。
最佳答案
Are there any disadvantages using the IDisposable Interace
当然,它什么也做不了。使用 Using 或调用 Dispose() 永远不是将变量设置为 Nothing 的合适方法。这就是您的代码所做的全部。
We completely avoid to use the two dot rule.
请继续忽略它,这是无稽之谈,只会引起悲伤。博客作者的隐含断言是,这样做会迫使程序员使用变量来存储 xlApp.Workbooks 的值。所以他以后有机会不要忘记调用 releaseObject()。但是还有更多的语句生成不使用点的接口(interface)引用。类似于 Range(x,y),那里有一个您永远看不到的隐藏 Range 对象引用。还必须存储它们只会产生令人难以置信的复杂代码。
而只忽略一个就足以完全无法完成工作。完全无法调试。这是 C 程序员必须编写的代码。并且经常惨败,大型 C 程序经常泄漏内存,而他们的程序员花费大量时间来寻找这些泄漏。当然不是 .NET 方式,它有一个垃圾收集器来自动执行此操作。它永远不会出错。
问题是,它处理工作的速度有点慢。非常设计。没有人注意到这一点,除了在这种代码中。您可以看到垃圾收集器没有运行,您仍然看到 Office 程序在运行。当您编写 xlapp.Quit() 时它并没有退出,它仍然存在于任务管理器的进程选项卡中。他们想要的是当他们这样说时它就退出。
这在 .NET 中很有可能,您当然可以强制 GC 完成工作:
GC.Collect()
GC.WaitForPendingFinalizers()
繁荣,每个 Excel 对象引用都会自动释放。无需自己存储这些对象引用并显式调用 Marshal.ReleaseComObject(),CLR 会为您完成。而且它永远不会出错,它不使用或不需要“双点规则”,并且可以毫不费力地找到那些隐藏的接口(interface)引用。
然而,最重要的是确切地放置此代码的位置。大多数程序员将其放在错误的位置,使用的方法与使用那些 Excel 界面的方法相同。这很好,但在调试代码时不起作用,这是一个在 this answer 中解释的怪癖。 .在博客作者的代码中,正确的做法是将代码移到一个小的辅助方法中,我们称它为 DoExcelThing()。像这样:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
DoExcelThing()
GC.Collect()
GC.WaitForPendingFinalizers()
'' Excel.exe no longer running anymore at this point
End Sub
请记住,这真的只是一个调试工件。程序员只是讨厌必须使用任务管理器来杀死僵尸 Excel.exe 实例。当他们停止调试器时僵尸化,阻止程序正常退出并收集垃圾。这是正常。当您的程序出于任何原因在生产中死亡时,也会发生这种情况。把你的精力用在它所属的地方,把错误从你的代码中移除,这样你的程序就不会死掉。 GC 不需要比这更多的帮助。
关于.net - 使用 IDisposable 清理 Excel Interop 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25433418/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!