2013-12-11 28 views
3

我有一个C#RtdServer,它接收来自TCPListener的数据更新。它的运行如预期,除了在某些时候,它仍然在工作表RTD() s在ServerTerminate()被调用,我似乎无法弄清楚为什么。Excel调用IRTD.ServerTerminate,但表中仍然存在有效的RTD公式

我的理解,如果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; 
} 

从上面,我希望看到HeartBeat电话每60秒(60Kms),但我看不到这个记录。我难住 - 任何想法?

+0

怎么样'心跳'?我期望它的失败被类似于'ServerStart'处理。 –

+0

上面增加了HB代码。我多久应该期待这个被称为? –

+1

当不再需要主题时调用服务器终止。每次调用ConnectData时,我都会记录新的ID,然后再将它们记录在DisconnectData上。你应该能够看到Excel是否认为没有更多的主题了。 – Franchesca

回答

1

一段时间后,我发现如果UI线程严重受到压力,excel将重新启动com服务器(rtd)。

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

  • 写50K +到纸张
  • 开始发射更新从它的源头(更高的数据吞吐量,就越有可能Excel将投降并重新启动COM服务器)
  • 设置Application.RTD.ThrottleInterval = 0//update whenever possible
  • 时启动和运行,使用 键盘快捷键(shift+▲▼◀▼
012片周围疯狂地浏览

这将可能导致Excel重启RTD并在这样做,第一个电话ServerTerminate()(不管如何在片存在着许多的RTD),然后调用ServerStart()有效地重新启动它说明了其行为记下的服务器。

服务器重启会重置您RTD实施中的所有数据,因此您应该将其视为完全重置,以便任何订阅也应该重置。

Hth!