2

我正在开发一个股票市场软件 (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 对象都会成功处理。但有时它确实停留在导致故障的过程中。有没有其他方法可以通过确保每次都处理对象来实现这一点?

4

2 回答 2

2

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

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

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

您也可以立即调用GC.Collect();强制它收集垃圾。

于 2013-08-13T14:47:07.603 回答
0

Marshal.FinalReleaseComObject方法将遍历所有对提供的 COM 对象的引用并删除它们。你可以试试这个而不是 ReleaseComObject()。

于 2013-08-13T14:42:27.570 回答