我有一个C#RtdServer
,它从TCPListener
接收数据更新。它按预期运行,除了在某些地方,当它在工作表中仍具有活动的RTD()
时,调用了ServerTerminate()
,但我似乎无法弄清楚为什么。
我的理解是,在以下情况下调用ServerTerminate()
:
删除所有rtd公式ServerStart()
不返回1
excel调用ServerTerminate()
还有什么其他原因?
编辑:
这是我设置HeartBeat
机制的方法:
public int ServerStart(IRTDUpdateEvent callback)
{
callback.HeartbeatInterval = 60000; // 1 min HB
_callback = callback;
// Other setup ...
return 1;
}
这是
HeartBeat
代码public int Heartbeat()
{
_log.Info("HB called...");
return 1;
}
从上面,我希望每60秒(60Kms)看到一次对
HeartBeat
的调用,但是我看不到对此的记录。我很困惑-有什么想法吗? 最佳答案
一段时间后,我发现如果UI线程压力很大,excel将重新启动com服务器(rtd)。
我能够通过积极使用键盘快捷键来重现此“服务器重新启动”:shift+▲▼◀▼
可以在工作表中加载大量活动RTD。尽管这不是强制excel重新启动服务器的可靠方法,但它通常足以进行测试。您可以尝试通过执行以下操作来重新启动com服务器:
将超过50K的RTD写入工作表
开始从您的RTD源触发更新(数据吞吐量越高,excel越有可能投降并重启com服务器)
设置Application.RTD.ThrottleInterval = 0//
(update wheneverpossible)
启动并运行后,使用
键盘快捷键(shift+▲▼◀▼
)
这可能会导致excel重新启动RTD,并且这样做,首先调用ServerTerminate()
(无论工作表中存在多少RTD),然后调用ServerStart()
有效地重新启动服务器,这说明了所指出的行为。
服务器重新启动会重置RTD实施中的所有数据,因此您应将其视为完全重置,因此也应重置所有订阅。
th!