﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Как чистить память?</title>
  <id>~/topic/3904/kak-chistit-pamyat/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-07T05:04:41Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=3904" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/27095/</id>
    <title type="text">Просмотрел я проект, выяснил, что проблема увеличения занятой памяти связана с увеличивающимся кол-в...</title>
    <published>2013-08-22T11:12:00Z</published>
    <updated>2013-08-22T11:12:33Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.ru/users/26984/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Просмотрел я проект, выяснил, что проблема увеличения занятой памяти связана с увеличивающимся кол-вом вызовов метода Trader.StartExport(); при каждом нажати на кнопку для подключения к терминалу.&lt;br /&gt;Это связано с тем, что перед каждым подключением к терминалу выполняется следующее:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

                                    Trader.Connected += () =&amp;gt;
                                    {
                                        try
                                        {
                                            //Запустить экспорт данных из торговой платформы
                                            Trader.StartExport();
                                        }
                                        catch (Exception ex)
                                        {
                                            //Вызвать событие появления нового исключения
                                             OnNewException(ex);
                                        }
                                    };&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;но при  этом нигде не вызывается Trader.Connected -= ...&lt;br /&gt;Т.о. событие Trader.Connected имеет все большее и большее кол-во экземпляров одного и того же обработчика, из-за чего и вызывается несколько раз метод Trader.StartExport(); при появлении одного события Trader.Connected.&lt;br /&gt;Выход: инициализировать объект Trader в отдельном методе (где есть код Trader.Connected += ...), только один раз, а не при каждом нажатии на кнопку подключения, либо при отключении от терминала выполнять код: Trader.Connected -= ...</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/27092/</id>
    <title type="text">Почему память может не высвобождаться? Или такая ерунда только у меня? Пришлите проект на почту iv_q...</title>
    <published>2013-08-21T16:07:15Z</published>
    <updated>2013-08-21T16:07:15Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.ru/users/26984/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Bond &lt;a href="https://stocksharp.ru/posts/m/27089/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Почему память может не высвобождаться? Или такая ерунда только у меня?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Пришлите проект на почту &lt;a href="https://stocksharp.ru/away/?u=AQAAAAAAAAAkAlIA1jlc-ZJHCHdUGPCeB4ew36__oNFwlPG5-1YrkQ"&gt;iv_qul@list.ru&lt;/a&gt; будем разбираться.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/27089/</id>
    <title type="text">Почему память может не высвобождаться? Или такая ерунда только у меня?</title>
    <published>2013-08-21T14:05:55Z</published>
    <updated>2013-08-21T14:05:55Z</updated>
    <author>
      <name>Bond</name>
      <uri>https://stocksharp.ru/users/26882/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Почему память может не высвобождаться? Или такая ерунда только у меня?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/27077/</id>
    <title type="text">Просто включаю и выключаю коннектор к Квику. И с каждым перезапуском он все тяжелее загружает данные...</title>
    <published>2013-08-20T17:42:42Z</published>
    <updated>2013-08-20T17:42:42Z</updated>
    <author>
      <name>Bond</name>
      <uri>https://stocksharp.ru/users/26882/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;IvanB &lt;a href="https://stocksharp.ru/posts/m/27044/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Bond &lt;a href="https://stocksharp.ru/posts/m/27041/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Просто включаю и выключаю коннектор к Квику. И с каждым перезапуском он все тяжелее загружает данные, а потом на 4-5 включении выбрасывает с ошибкой о переполнении памяти. С каждым включением он съедает 400 Мб оперативной памяти, а после отключения её не выгружает. Только когда закрываешь окно коннектора он освобождает память. Код отключения у меня как из уроков:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

public void DisConnectSafe()
        {
            //Если коннектор к торговой платформе не пуст и соединение установлено
            if(Trader!=null &amp;amp;&amp;amp; Trader.IsConnected)
            {
                Trader.StopExport();
                Trader.Disconnect();
                
            }
        }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Dispose() не помогает!!!&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Убедитесь, что DisConnectSafe вызывается при отключении коннектора, и если в обычном виде (код выше) мусор из памяти не освобождается, то сделайте так:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

public void DisConnectSafe()
        {
            //Если коннектор к торговой платформе не пуст и соединение установлено
            if(Trader!=null)
            {
                if (Trader.IsConnected)
                {
                   Trader.StopExport();
                   Trader.Disconnect();
                }
                Trader.Dispose();
                Trader=null;
                GC.Collect();
            }
        }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Эффекта 0! При пошаговой проверке оказалось, что после Trader.Disconnect(), Trader.Dispose(), GC.Collect() память уменьшается на 10-20Мбайт не более, а вся прога жрет под 300Мбайт.&lt;br /&gt;А при Trader=null; при повторном запуске при нажатии на кнопку вылетает по Эксепшену. И правильно на мой взгляд делает. Вообще эту строку закомментил.&lt;br /&gt;Может не освобождает потому, что Trader где-то ещё используется? Я к сожалению в тонкостях не разбираюсь...&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

using System;
using System.IO;
using System.Linq;
using Ecng.Collections;
using StockSharp.Algo;
using StockSharp.BusinessEntities;
using StockSharp.Quik;

namespace StockSharp.TraderConnection
{
    /// &amp;lt;summary&amp;gt;
    /// Безопасное подключение
    /// &amp;lt;/summary&amp;gt;
    public class SafeConnection
    {
        /// &amp;lt;summary&amp;gt;
        /// Коннектор к торговой платформе
        /// &amp;lt;/summary&amp;gt;
        public BaseTrader Trader { get; private set; }

        /// &amp;lt;summary&amp;gt;
        /// Событие появления нового исключения
        /// &amp;lt;/summary&amp;gt;
        public event Action&amp;lt;Exception&amp;gt; NewException = delegate { };

        /// &amp;lt;summary&amp;gt;
        /// Конструктор. Создать безопасное подключение
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;trader&amp;quot;&amp;gt;Коннектор к торговой платформе&amp;lt;/param&amp;gt;
        public SafeConnection(BaseTrader trader)
        {
            Trader = trader;
        }

        /// &amp;lt;summary&amp;gt;
        /// Вызвать событие появления нового исключения
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;exception&amp;quot;&amp;gt;Исключение&amp;lt;/param&amp;gt;
        protected virtual void OnNewException(Exception exception)
        {
            //Вызвать событие появления нового исключения
            NewException(exception);
        }

        /// &amp;lt;summary&amp;gt;
        /// Подключиться безопасно к торговой платформе
        /// &amp;lt;/summary&amp;gt;
        public void _ConnectSafe()
        {
            //Интервал переподключения
            Trader.ReConnectionSettings.Interval = TimeSpan.FromSeconds(10);
            //Когда переподключаться
            Trader.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime;
            //Запускать ли заново экспрорт после переподключения
            Trader.ReConnectionSettings.IsReStartExport = true;
            //Подписаться на появление ошибки подключения от трейдера
            Trader.ConnectionError += OnNewException;
            //Подписаться на появление ошибок не выставленной заявки
            Trader.OrdersRegisterFailed += fails =&amp;gt; fails.ForEach(f =&amp;gt; OnNewException(f.Error));
            //Подписаться на событие успешного подключения к торговой платформе
            Trader.Connected += () =&amp;gt;
                                    {
                                        try
                                        {
                                            //Запустить экспорт данных из торговой платформы
                                            Trader.StartExport();
                                        }
                                        catch (Exception ex)
                                        {
                                            //Вызвать событие появления нового исключения
                                             OnNewException(ex);
                                        }
                                    };

            //Подключиться к торговой платформе
            Trader.Connect();
        }

        public void ConnectSafe()
        {
            const string pathKey = (@&amp;quot;C:\Key_Junior\Key_Junior.txt&amp;quot;);

            var pathFile = File.ReadLines(pathKey).Skip(0).First();

            var terminal = QuikTerminal.Get(pathFile);

            if (!terminal.IsLaunched)
            {
                Console.WriteLine(&amp;quot;Запускается Quik...&amp;quot;);

                terminal.Launch();

                Console.WriteLine(&amp;quot;Quik запущен&amp;quot;);
            }


            if (!terminal.IsConnected)
            {
                var login = File.ReadLines(pathKey).Skip(1).First();

                var password = File.ReadLines(pathKey).Skip(2).First();

                terminal.Login(login, password);

                Console.WriteLine(&amp;quot;Авторизация произведена&amp;quot;);

            }
            if (terminal.IsConnected) _ConnectSafe();


        }

        /// &amp;lt;summary&amp;gt;
        /// Разорвать соединение с торговой платформой
        /// &amp;lt;/summary&amp;gt;
        public void DisConnectSafe()
        {
            //Если коннектор к торговой платформе не пуст и соединение установлено
            if (Trader != null)
            {
                if (Trader.IsConnected)
                {
                    Trader.StopExport();
                    Trader.Disconnect();
                }
                Trader.Dispose();
                // Trader = null;
                GC.Collect();
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Возвращает. установлено ли соединение с торговй платформой
        /// &amp;lt;/summary&amp;gt;
        public bool IsConnected
        {
            get
            {
                return Trader != null &amp;amp;&amp;amp; Trader.IsConnected;
            }
        }
    }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using Ecng.Xaml;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.TraderConnection;

namespace StockSharp.WpfConnectionInterface
{
    /// &amp;lt;summary&amp;gt;
    /// Логика взаимодействия для UserControl1.xaml
    /// &amp;lt;/summary&amp;gt;
    public partial class InterFace : UserControl
    {
        //Поле, безопасный коннектор
        private SafeConnection _safeConnection;

        /// &amp;lt;summary&amp;gt;
        /// Безопасный коннектор
        /// &amp;lt;/summary&amp;gt;
        public SafeConnection SafeConnection 
        { 
            set
            {
                _safeConnection = value;
                //Изменить доступность кнопки в соответствии с состоянием переменной _safeConnection
                btnConnect.IsEnabled = _safeConnection!=null;
            }
            get { return _safeConnection; }
        }

        /// &amp;lt;summary&amp;gt;
        /// Конструктор
        /// &amp;lt;/summary&amp;gt;
        public InterFace()
        {
            InitializeComponent();

            //Событие завершения загрузки данного контрола
            Loaded += InterFace_Loaded;

            //Сделать кнопку не доступной
            btnConnect.IsEnabled = false;
        }

        /// &amp;lt;summary&amp;gt;
        /// Событие завершения загрузки данного контрола
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&amp;quot;routedEventArgs&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
        void InterFace_Loaded(object sender, RoutedEventArgs routedEventArgs)
        {
            //Получить родительское окно
            var window = Window.GetWindow(Parent);
            if (window != null)
                window.Closed += delegate
                    {
                        if (_safeConnection != null)
                            _safeConnection.DisConnectSafe();
                    };
        }

        /// &amp;lt;summary&amp;gt;
        /// Выбранный инструмент
        /// &amp;lt;/summary&amp;gt;
        public Security SelectedSecurity
        {
            get { return (Security)cbSecurities.SelectedItem; }
        }

        /// &amp;lt;summary&amp;gt;
        /// Выбранный портфель
        /// &amp;lt;/summary&amp;gt;
        public Portfolio SelectedPortfolio
        {
            get { return (Portfolio)cbPortfolios.SelectedItem; }
        }

        /// &amp;lt;summary&amp;gt;
        /// Нажатие на кнопку подключения
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
        private void ConnectClick(object sender, RoutedEventArgs e)
        {
            if (_safeConnection == null)
                return;

            if (_safeConnection.IsConnected)
            {
                btnConnect.Content = &amp;quot;Отключаем&amp;quot;;
                btnConnect.Background = System.Windows.Media.Brushes.OrangeRed;
                cbPortfolios.Background = System.Windows.Media.Brushes.LightPink;
                cbSecurities.Background = System.Windows.Media.Brushes.LightPink;
                btnConnect.IsEnabled = false;
                
                //Отписаться от события появления новых инструментов
                _safeConnection.Trader.NewSecurities -= Trader_NewSecurities;
                //Отписаться от события появления новых портфелей
                _safeConnection.Trader.NewPortfolios -= Trader_NewPortfolios;

                //Объявляем действие, которое нужно выполнить при отключении от торговой платформы
                Action disconnected = null;
                disconnected = () =&amp;gt;
                    {
                        _safeConnection.Trader.Disconnected -= disconnected;
                        this.GuiAsync(() =&amp;gt;
                            {
                                btnConnect.IsEnabled = true; btnConnect.Content = &amp;quot;Отключен&amp;quot;;
                            });
                    };
                _safeConnection.Trader.Disconnected += disconnected;
                
                //Разорвать соединение
                _safeConnection.DisConnectSafe();
            }
            else
            {
                btnConnect.Content = &amp;quot;Подключаем&amp;quot;;
                btnConnect.Background = System.Windows.Media.Brushes.LimeGreen;
                if ( SelectedPortfolio != null) cbPortfolios.Background = System.Windows.Media.Brushes.LightGreen;
                if ( SelectedSecurity != null) cbSecurities.Background = System.Windows.Media.Brushes.LightGreen;
                btnConnect.IsEnabled = false;

                //Подписаться на событие появления новых инструментов
                _safeConnection.Trader.NewSecurities += Trader_NewSecurities;
                //Подписаться на событие появления новых портфелей
                _safeConnection.Trader.NewPortfolios += Trader_NewPortfolios;

                //Объявляем действие, которое нужно выполнить при подключении к торговой платформе
                Action connected = null;
                connected = () =&amp;gt;
                {
                    _safeConnection.Trader.Connected -= connected;
                    this.GuiAsync(() =&amp;gt; { btnConnect.IsEnabled = true; btnConnect.Content = &amp;quot;Включен&amp;quot;; });
                };
                _safeConnection.Trader.Connected += connected;

                //Подключиться безопасно
                _safeConnection.ConnectSafe();

            }
        }

        /// &amp;lt;summary&amp;gt;
        /// Появление новых портфелей
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;portfolios&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
        private void Trader_NewPortfolios(IEnumerable&amp;lt;Portfolio&amp;gt; portfolios)
        {
            this.GuiAsync(() =&amp;gt;
                {
                    cbPortfolios.ItemsSource = _safeConnection.Trader.Portfolios;
                    cbPortfolios.Background = System.Windows.Media.Brushes.LightGreen;
                });
        }
        
        /// &amp;lt;summary&amp;gt;
        /// Появление новых торговых инструментов
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&amp;quot;securities&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;
        private void Trader_NewSecurities(IEnumerable&amp;lt;Security&amp;gt; securities)
        {
            this.GuiAsync(() =&amp;gt;
                {
                    cbSecurities.ItemsSource = _safeConnection.Trader.Securities;
                    cbSecurities.Background = System.Windows.Media.Brushes.LightGreen;
            });
        }

        public void PushInformationToStrategy(Strategy strategу)
        {
            strategу.Trader = SafeConnection.Trader;
            strategу.Portfolio = SelectedPortfolio;
            strategу.Security = SelectedSecurity;
        }

        private void cbSecurities_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }
    }
}

&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/27044/</id>
    <title type="text">Просто включаю и выключаю коннектор к Квику. И с каждым перезапуском он все тяжелее загружает данные...</title>
    <published>2013-08-16T05:10:07Z</published>
    <updated>2013-08-16T05:10:07Z</updated>
    <author>
      <name>IvanB</name>
      <uri>https://stocksharp.ru/users/26984/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Bond &lt;a href="https://stocksharp.ru/posts/m/27041/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Просто включаю и выключаю коннектор к Квику. И с каждым перезапуском он все тяжелее загружает данные, а потом на 4-5 включении выбрасывает с ошибкой о переполнении памяти. С каждым включением он съедает 400 Мб оперативной памяти, а после отключения её не выгружает. Только когда закрываешь окно коннектора он освобождает память. Код отключения у меня как из уроков:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

public void DisConnectSafe()
        {
            //Если коннектор к торговой платформе не пуст и соединение установлено
            if(Trader!=null &amp;amp;&amp;amp; Trader.IsConnected)
            {
                Trader.StopExport();
                Trader.Disconnect();
                
            }
        }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Dispose() не помогает!!!&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Убедитесь, что DisConnectSafe вызывается при отключении коннектора, и если в обычном виде (код выше) мусор из памяти не освобождается, то сделайте так:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

public void DisConnectSafe()
        {
            //Если коннектор к торговой платформе не пуст и соединение установлено
            if(Trader!=null)
            {
                if (Trader.IsConnected)
                {
                   Trader.StopExport();
                   Trader.Disconnect();
                }
                Trader.Dispose();
                Trader=null;
                GC.Collect();
            }
        }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/27041/</id>
    <title type="text">Просто включаю и выключаю коннектор к Квику. И с каждым перезапуском он все тяжелее загружает данные...</title>
    <published>2013-08-15T20:50:22Z</published>
    <updated>2013-08-15T20:50:22Z</updated>
    <author>
      <name>Bond</name>
      <uri>https://stocksharp.ru/users/26882/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Просто включаю и выключаю коннектор к Квику. И с каждым перезапуском он все тяжелее загружает данные, а потом на 4-5 включении выбрасывает с ошибкой о переполнении памяти. С каждым включением он съедает 400 Мб оперативной памяти, а после отключения её не выгружает. Только когда закрываешь окно коннектора он освобождает память. Код отключения у меня как из уроков:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Код&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

public void DisConnectSafe()
        {
            //Если коннектор к торговой платформе не пуст и соединение установлено
            if(Trader!=null &amp;amp;&amp;amp; Trader.IsConnected)
            {
                Trader.StopExport();
                Trader.Disconnect();
                
            }
        }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Dispose() не помогает!!!</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>