COM对象未关闭

时间:2013-08-13 14:36:45

标签: c# .net

我正在开发股票市场软件(AmiBroker)插件,其中我必须调用COM对象才能检索活动符号。即当用户请求特定符号时,我必须向服务器发送请求以获取库存数据。因此,AmiBroker使用COM公开了一些函数,允许检索已请求的符号。

代码

System.Timers.Timer tm = new Timer(1000);
tm.Elapsed += delagate(sender, e)
{
    dynamic broker = Activator.CreateInstance(Type.GetTypeFromProgID("Broker.Application", true));
    hashtable.Add(uniquernd, broker.GetActiveSymbols());
    Marshal.ReleaseCOMObject(broker);
}

注意:这就是我在C#中实现逻辑的方法(在此代码中找不到语法错误)

有时当我关闭AmiBroker应用程序时,每个COM对象都会成功处理掉。但有时它确实会停留在导致故障的过程中。是否有任何替代方法可以确保每次都能处理对象?

2 个答案:

答案 0 :(得分:2)

C#中的COM对象需要特殊处理。

您应该使用变量来保存指向每个COM对象的指针,这意味着如果您的对象具有返回另一个COM对象的属性,您应该使用变量来保留它们,然后在每个对象上使用Marshal.ReleaseComObject(v);
否则,.NET框架将创建一个ah-hoc COM holder对象,将来会被释放。

finally子句中,请记住将变量设置为 null ,以便垃圾收集器完全释放它。

您现在也可以致电GC.Collect();强制它收集垃圾。

答案 1 :(得分:0)

Marshal.FinalReleaseComObject方法将循环遍历所提供的COM对象的所有引用并将其删除。您可以尝试使用它而不是ReleaseComObject()。