Excel中调用IRTD.ServerTerminate时,表中仍然有活动的RTD公式
我有一个从TCPListener
接收数据更新的C# RtdServer
。 它的运行如预期,除了在某些时候,它仍然在工作表ServerTerminate()
调用表中的活动RTD()
s,我似乎无法弄清楚为什么。
我了解, 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
但我看不到这个logging。 我难住 – 任何想法?
一段时间后,我发现,如果UI线程严重受到压力,excel将重新启动一个com服务器(rtd)。
我能够通过积极使用键盘快捷方式来重现这种“服务器重启”: shift+▲▼◀▼
在负载有活动RTD的表单中导航。 虽然这不是强制excel重新启动服务器的可靠方法,但它通常足以进行testing。 您可以尝试通过执行以下操作来重新生成com服务器重新启动:
- 将50K +的RTD写入表单
- 开始在你的RTD上从它的源发射更新(数据吞吐量越高,excel越可能投降并重新启动com服务器)
- 设置
Application.RTD.ThrottleInterval = 0//
( 尽可能更新 ) - 当启动并运行时,使用键盘快捷键(
shift+▲▼◀▼
)
这可能会导致excel重新启动RTD,并首先调用ServerTerminate()
(不pipe表单中存在多less个RTD),然后调用ServerStart()
有效地重新启动服务器,以解释所logging的行为。
服务器重新启动将重置RTD实施中的所有数据,因此您应该将其视为完全重置,以便任何订阅也应该重置。
心连心!