Excel在工作表中仍有活动的RTD公式时调用IRTD.ServerTerminate

时间:2013-12-11 04:44:19

标签: c# excel rtd com-server

我有一个C#RtdServer,可以从TCPListener接收数据更新。它是按预期运行的,除非在某些点上它仍然在工作表RTD()中仍然有活动的ServerTerminate()被调用,我似乎无法找出原因。

我理解如果:{/ 1>被调用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秒(60公里)看到HeartBeat的电话,但我看不到记录这个。我很难过 - 任何想法?

1 个答案:

答案 0 :(得分:1)

经过一段时间后,我发现如果UI线程严重不足,excel将重新启动一个com服务器(rtd)。

我能够通过积极使用键盘快捷键来重现这种“服务器重启”:shift+▲▼◀▼在一个载有大量活动RTD的工作表中导航。虽然这不是强制excel重启服务器的可靠方法,但它的工作经常足以进行测试。您可以尝试通过执行以下操作重现com服务器重新启动:

  • 将50K +的RTD写入表格
  • 从您的RTD源开始在您的RTD上启动更新(数据吞吐量越高,excel将投降并重启com服务器的可能性越大)
  • 设置Application.RTD.ThrottleInterval = 0//update whenever possible
  • 启动并运行时,使用。在纸张周围疯狂导航 键盘快捷键(shift+▲▼◀▼

这将可能导致excel重新启动RTD并且这样做,首先调用ServerTerminate()(无论工作表中存在多少RTD)然后调用ServerStart()有效地重启服务器,解释了所指出的行为。

服务器重启会重置RTD实现中的所有数据,因此您应将此视为完全重置,因此也应重置所有订阅。

H个!