Это не проблема SignalR, это происходит из-за того, что в упомянутом руководстве есть ряд ошибок, наиболее очевидной из которых является тот факт, что он постоянно создает экземпляры SqlDependency
, но затем уничтожает их, не отписываясь от события OnChange
. Вы должны начать с добавления чего-то вроде этого:
SqlDependency dependency = sender as SqlDependency;
dependency.OnChange -= dependency_OnChange;
перед вызовом SendNotifications
внутри вашего обработчика событий. Проверьте это для вдохновения.
ОБНОВЛЕНИЕ (предыдущий ответ не совсем точен, но сохранен для контекста)
Основная проблема здесь заключается в том, что этот метод создает своего рода автоматически восстанавливающуюся бесконечную последовательность SqlDependencies
из внутренних экземпляров страниц Web Forms, что делает их недоступными, как только ваша страница завершит рендеринг. Это означает, что после завершения жизненного цикла вашей страницы и ее отображения цепочка зависимостей остается живой и продолжает работать, даже если созданный экземпляр страницы завершил свой цикл. Обработчик событий также сохраняет активным экземпляр страницы, даже если он недоступен, что приводит к утечке памяти.
Единственный способ, которым вы можете это контролировать, — это генерировать эти цепочки где-то еще, например, внутри статического типа, который вы можете вызывать, передавая какой-то уникальный идентификатор (может быть, комбинацию имени страницы и имени пользователя? Это зависит от вашей логики). При первом вызове он будет делать то, что сейчас происходит в вашем текущем коде, но как только вы сделаете другой вызов с теми же параметрами, он ничего не сделает, поэтому ранее созданная цепочка останется единственной, уведомляющей, без повторяющихся вызовов. .
Это всего лишь предложение, возможных решений может быть много, но вам нужно понимать исходную проблему и тот факт, что практически невозможно удалить эти цепочки автоматически восстанавливающихся зависимостей, если вы не найдете способ их отслеживать. и создавать их только при необходимости. Я надеюсь, что эта часть ясна.
PS: это поведение очень похоже на то, что вы иногда получаете с утечкой обработчиков событий и сохранением живых объектов, которые должны быть убиты, это то, что обмануло меня в предыдущем ответе. Это в некотором роде похожая проблема (утечка объектов), но с совершенно другой причиной. Руководство, которому вы следуете, не разъясняет этого и приводит вас к ситуации, когда фантомный код продолжает выполняться, а память теряется.
person
Wasp
schedule
21.05.2015