rss

Профиль компании

Финансовые компании

Блог компании Os_Engine | Стандарты кода #13. Сборка мусора и очищение памяти. Dispose. Коннекторы для Os Engine # 35

Вероятно, для каких-то молодых камрадов это будет откровением, ибо каждая книжка по Шарпам уже с первых глав нас знакомит с тем, что в C# за сборкой мусора следить не надо. Однако это маркетинговая выдумка. В высоко нагруженных проектах вроде OsEngine, как только ты не проследил за удалением объектов и выкинул это из головы, началась утечка памяти.

 Стандарты кода #13. Сборка мусора и очищение памяти. Dispose. Коннекторы для Os Engine # 35
Я и сам, как программист-самоучка, очень много лет проживал в этой парадигме, от чего было много проблем как у меня, так и у пользователей OsEngine.

И в этом посте поговорим о том, какие штуки надо обязательно подчищать за собой при удалении коннектора. А вернее при вызове его обязательного к перегрузке метода DISPOSE();

 

Dispose в коннекторе.

Очень часто коннектор нуждается в перезапуске. Это обусловлено свойствами работы сети интернет. В этот момент у ServerRealization вызывается метод Dispose. Все манипуляции по очищению памяти и переменных нужно делать из этого метода. И ни из какого другого…

 

Сборщику мусора нужна помощь.

Сборщик мусора в C# всё же есть, и обращаться к нему на прямую не стоит. Однако он убирает из памяти только те объекты, на которые нет ссылок!

В связи с этим есть несколько общих правил во время создания и удаления объектов.

  1. Удаляешь объект – убедись, что он не валяется ни в каком классе как поле. Прямых ссылок на него не должно остаться. Везде должен быть null.
  2. Удаляешь объект – почисти обработчики событий, на которые он подписан.
  3. Перед удалением объекта убедись, что он выключен и все потоки внутри него отключены.

Эти простые правила помогут Вам во время написания коннектора.

 

WebSockets – правильное удаление.

 Стандарты кода #13. Сборка мусора и очищение памяти. Dispose. Коннекторы для Os Engine # 35
Рис. 1. Правильное закрытие и подготовка webSocket к очищению из памяти сборщиком мусора. BitGet

  1. Создаём отдельный метод для удаления сокета. Проверяем, есть ли вообще объект. Вдруг, откуда-то из кода очищение вызвано несколько раз.
  2. Закрываем сокет в обработчике ошибки. Такое тоже бывает, штука сложная, может сбойнуть. Но не выходим из метода в перехватчике.
  3. Отписываемся от всех событий, на которые мы подписаны с этого объекта.
  4. Удаляем ссылку на webSocket.

После этого, если объект webSocket нигде больше не указан по ссылке, объект может быть очищен сборщиком мусора. Целенаправленно вызывать сборщик не следует, ибо это ресурсозатратное мероприятие. Сборщик сделает своё дело тогда, когда это будет нужно.

 

Очищайте массивы данных при Dispose.

Стандарты кода #13. Сборка мусора и очищение памяти. Dispose. Коннекторы для Os Engine # 35

Рис. 1. Правильный и защищённый Dispose. BitGet

  1. В данном случае идёт очищение бумаг, которые ранее были подписаны на стаканы и трейды.
  2. Блок finally выполняется в любом случае. И успеха, и неуспеха блока try.
  3. IsDispose – переменная, которая блокирует поступление сообщений из сокета и в случае, если она true, останавливает потоки, которые обслуживают коннектор.
  4. Лист с сообщениями из вёбсокет соединения.
  5. Высылаем на верх сообщения об изменении статуса, только если он действительно изменился.

 

Пост из серии «Коннекторы к OsEngine»

Серия о том, как стать настоящим программистом и изменить свою профессию.

Оглавление и смыслы здесь: https://smart-lab.ru/company/os_engine/blog/959953.php

Комментарии открыты для друзей, добавляйтесь!

Стандарты кода #13. Сборка мусора и очищение памяти. Dispose. Коннекторы для Os Engine # 35

OsEngine: https://github.com/AlexWan/OsEngine
Поддержка OsEngine: https://t.me/osengine_official_support

Регистрируйся в АЛОР и получай бонусы: https://www.alorbroker.ru/open
Сайт АЛОР БРОКЕР: https://www.alorbroker.ru
Раздел «Для клиентов»: https://www.alorbroker.ru/openinfo/for-clients
Программа лояльности от АЛОР БРОКЕР:https://smart-lab.ru/company/os_engine/blog/972745.php 

Стандарты кода #13. Сборка мусора и очищение памяти. Dispose. Коннекторы для Os Engine # 35

★3

теги блога Алексей Ван <o-s-a.net>

....все тэги



UPDONW
Новый дизайн