Excel вызывает IRTD.ServerTerminate, пока на листе еще есть активные формулы RTD

У меня есть 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;
}

Сверху ожидаю увидеть звонки HeartBeat каждые 60 секунд (60 км), но я не вижу записи этого. Я в тупике - есть идеи??

1 ответ

Решение

Через некоторое время я обнаружил, что Excel перезапустит com-сервер (rtd), если поток пользовательского интерфейса сильно загружен.

Я смог воспроизвести этот "перезапуск сервера", активно используя горячие клавиши: shift+▲▼◀▼ перемещаться по листу, который сильно загружен активными RTD. Хотя это не надежный метод принудительного запуска Excel для перезапуска сервера, он работает достаточно часто для тестирования. Вы можете попытаться воспроизвести перезагрузку com-сервера, выполнив следующие действия:

  • запишите 50K+ ваших RTD на лист
  • запускать обновления на вашем RTD из его источника (чем выше пропускная способность данных, тем больше вероятность, что excel капитулирует и перезапустит com-сервер)
  • установить Application.RTD.ThrottleInterval = 0// ( обновить по возможности)
  • при запуске бегайте по листу с помощью сочетаний клавиш (shift+▲▼◀▼)

Это может привести к тому, что Excel перезапустит RTD и при этом сначала вызовет ServerTerminate() (независимо от того, сколько RTD существует в листе), а затем вызвать ServerStart() эффективный перезапуск сервера, который объясняет отмеченное поведение.

Перезапуск сервера сбрасывает все данные в вашей реализации RTD, поэтому вы должны рассматривать это как полный сброс, поэтому любые подписки также должны быть сброшены.

Hth!

Другие вопросы по тегам