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!