我有一个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!

08-05 15:05