我有一个程序,它使用某种类型的Ole连接来建立与Cam/cad软件Powershape的连接。它使用一个类变量与powershape建立连接,它的属性包含有关打开的模型的信息。
问题是,只有当类变量结束或超出范围时,此连接才结束。
Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)这在Sub中工作得很好,因为它超出了范围,但当您需要来自powershape的数据时,此程序需要您多次执行此操作,并且每次可能需要一些时间才能再次建立连接。因此,您可以将其设置为全局变量,这样您只需要连接一次。
Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)
Powershapeglobal = powershapeRoot但是现在,这个变量只有在程序关闭后才会超出作用域。我试着使用:
Powershapeglobal.dispose
Powershapeglobal = nothing这些都没有帮助,而且这种联系似乎仍然存在,因为变量仍然存在?如何永久销毁变量?
发布于 2016-04-03 02:31:48
在.NET中,当.NET变量超出作用域时,不会销毁非托管资源。当垃圾收集器将它们从内存中删除时,只要垃圾收集器觉得有必要,它们就会被销毁。这被称为“非确定性完成”,因为开发人员并不确定对象完成的确切时刻。
要确保外部资源在使用完毕后被清除,请调用相关对象的Dispose()方法:
Dim powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)并且,当您想要释放连接时:
powershapeRoot.Dispose();或者,要让Dispose自动发生,可以使用.NET "Using“语句:
Using powershapeRoot As New PSAutomation(Delcam.ProductInterface.InstanceReuse.UseExistingInstance)
End Using ' Dispose is called automatically here现在,对于COM对象,该过程还有另一个步骤,您必须显式调用ReleaseComObject()方法,如下所示:
System.Marshall.ReleaseComObject(powershapeRoot);然后调用Dispose()。但是,只有在显式引用了COM程序集之后才需要这样做。对于OleDB连接,调用Dispose就足够了。
https://stackoverflow.com/questions/36375012
复制相似问题