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实施中的所有数据,因此您应该将其视为完全重置,以便任何订阅也应该重置。

心连心!