﻿<?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/3065/uskorenie-raboty-gidry-pri-bolshom-kolichestve-instrumentov/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-04T09:37:21Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=3065" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/21692/</id>
    <title type="text">Вот такие оптимизации я сделал в своей Гидре версии 4.1.3. Посмотрите гидру последней версии 4.1.5. ...</title>
    <published>2012-10-08T16:27:33Z</published>
    <updated>2012-10-08T16:27:33Z</updated>
    <author>
      <name>Цифровой</name>
      <uri>https://stocksharp.ru/users/6267/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Moadip &lt;a href="https://stocksharp.ru/posts/m/21686/" 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;Цитата:&lt;/span&gt;&lt;div class="innerquote"&gt;Вот такие оптимизации я сделал в своей Гидре версии 4.1.3.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Посмотрите гидру последней версии &lt;b&gt;4.1.5&lt;/b&gt;. Там многое поменялось.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Верное замечание.&lt;br /&gt;Перед публикацией поста я посмотрел, что вышли новые версии.&lt;br /&gt;Правда на BOX версия 4.1.5 без исходников (на CodePlex посмотреть как-то не догадался).&lt;br /&gt;В версии 4.1.4 хотя бы часть оптимизаций не реализована (все не просматривал)&lt;br /&gt;&lt;br /&gt;Если уже в версии 4.1.5 что-то из перечисленного мной поправили - это супер!</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21691/</id>
    <title type="text">Хорошее исследование. Спасибо! Надеюсь, что какие-то из оптимизаций появятся, если еще не появились,...</title>
    <published>2012-10-08T16:23:49Z</published>
    <updated>2012-10-08T16:23:49Z</updated>
    <author>
      <name>Цифровой</name>
      <uri>https://stocksharp.ru/users/6267/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.ru/posts/m/21684/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Хорошее исследование.[thumbup] &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Спасибо! Надеюсь, что какие-то из оптимизаций появятся, если еще не появились, в будущих версиях Гидры.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.ru/posts/m/21684/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Цифровой &lt;a href="https://stocksharp.ru/posts/m/21683/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Удаление 1000 инструментов из SQLLite занимает примерно минуту.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Надо удалять в транзакции, возрастает скорость на порядки. Известная особенность SQLite.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Спасибо за совет. Попробую. Когда получится предложу код.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.ru/posts/m/21684/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Насчет инструментов, то тут не все однозначно. С одной стороны грузить можно только то, что нужно. Но некоторым источникам (например как РТС) нужно в моменте достаточно большое кол-во инструментов. Финаму же - нет. С другой стороны, может оказаться так, что быстрее при старте загрузить всю информацию. И это время компенсирует задержки, вызванные отложенными загрузками во время &amp;quot;работы&amp;quot; Гидры. Которые мы, кстати, можем и не заметить за счет того, что идет все в фоновом режиме. Но задержки эти будут.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Согласен. Именно по этому я прежде всего пытался оптимизировать работу, а уже потом написал команду удаления &amp;quot;невыбранных&amp;quot; инструментов.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21686/</id>
    <title type="text">Вот такие оптимизации я сделал в своей Гидре версии 4.1.3. Посмотрите гидру последней версии 4.1.5. ...</title>
    <published>2012-10-08T06:00:23Z</published>
    <updated>2012-10-08T06:00:23Z</updated>
    <author>
      <name>Moadip</name>
      <uri>https://stocksharp.ru/users/5973/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Цитата:&lt;/span&gt;&lt;div class="innerquote"&gt;Вот такие оптимизации я сделал в своей Гидре версии 4.1.3.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Посмотрите гидру последней версии &lt;b&gt;4.1.5&lt;/b&gt;. Там многое поменялось.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21684/</id>
    <title type="text">Хорошее исследование. Удаление 1000 инструментов из SQLLite занимает примерно минуту. Надо удалять в...</title>
    <published>2012-10-07T21:09:48Z</published>
    <updated>2012-10-07T21:11:02Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.ru/users/201/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Хорошее исследование.[thumbup] &lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Цифровой &lt;a href="https://stocksharp.ru/posts/m/21683/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Удаление 1000 инструментов из SQLLite занимает примерно минуту.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Надо удалять в транзакции, возрастает скорость на порядки. Известная особенность SQLite.&lt;br /&gt;&lt;br /&gt;Насчет инструментов, то тут не все однозначно. С одной стороны грузить можно только то, что нужно. Но некоторым источникам (например как РТС) нужно в моменте достаточно большое кол-во инструментов. Финаму же - нет. С другой стороны, может оказаться так, что быстрее при старте загрузить всю информацию. И это время компенсирует задержки, вызванные отложенными загрузками во время &amp;quot;работы&amp;quot; Гидры. Которые мы, кстати, можем и не заметить за счет того, что идет все в фоновом режиме. Но задержки эти будут.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21683/</id>
    <title type="text">С другой стороны, даже не смотря на все эти оптимизации, сам запуск Гидры будет долгим, т.к. хотя бы...</title>
    <published>2012-10-07T19:43:37Z</published>
    <updated>2012-10-07T19:43:37Z</updated>
    <author>
      <name>Цифровой</name>
      <uri>https://stocksharp.ru/users/6267/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">С другой стороны, даже не смотря на все эти оптимизации, сам запуск Гидры будет долгим,&lt;br /&gt;т.к. хотя бы один раз инструменты зачитать придется.&lt;br /&gt;Поэтому если по факту используется небольшое количество инструментов, разумно остальные просто удалить.&lt;br /&gt;&lt;br /&gt;У себя я даже реализовал такую команду в Гидре.&lt;br /&gt;Но работала она довольно долго. Удаление 1000 инструментов из SQLLite занимает примерно минуту.&lt;br /&gt;Поэтому удаление моих 30 000 заняло около получаса.&lt;br /&gt;Единственный плюс по сравнению со сносом базы: не пришлось забивать настройки ручками заново.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/21682/</id>
    <title type="text">Доброго времени суток! Недавно обнаружил, что Гидра начинает прилично подтормаживать при большом кол...</title>
    <published>2012-10-07T19:36:40Z</published>
    <updated>2012-10-07T19:36:40Z</updated>
    <author>
      <name>Цифровой</name>
      <uri>https://stocksharp.ru/users/6267/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Доброго времени суток!&lt;br /&gt;&lt;br /&gt;Недавно обнаружил, что Гидра начинает прилично подтормаживать при большом количестве инструментов.&lt;br /&gt;Получил такую ситуацию довольно просто: запустил импорт инструментов у источника Smart (из демо-сервера),&lt;br /&gt;в ходе которого мне прилетело около 30 000 инструментов.&lt;br /&gt;После этого запуск Гидры и переход между вкладками начали тормозить,&lt;br /&gt;а запуска импорта маркет-данных из Smart было не дождаться: он отваливался по таймауту.&lt;br /&gt;&lt;br /&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;

entityRegistry.Securities
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Сразу оговорюсь: в качестве хранилища я использую &lt;b&gt;SQLLite&lt;/b&gt;, и, возможно, MS SQL Server тормозит значительно меньше.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;0.&lt;/b&gt; Понятно, что хотя бы один раз данные об инструментах из базы данных зачитать надо.&lt;br /&gt;Это происходит в классе SecurityStorage:&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;

public SecurityStorage(IEntityRegistry entityRegistry)
{
	if (entityRegistry == null)
		throw new ArgumentNullException(&amp;quot;entityRegistry&amp;quot;);
	foreach (var security in entityRegistry.Securities)
		AddToCache(security);
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Здесь все зачитанные данные мудро кладутся в кэш.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.&lt;/b&gt; Но вот если посмотреть на класс FinamSecurityStorage, то здесь все уже не так радужно:&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;

public FinamSecurityStorage(ISecurityStorage underlyingStorage, HydraEntityRegistry entityRegistry)
{
	if (underlyingStorage == null)
		throw new ArgumentNullException(&amp;quot;underlyingStorage&amp;quot;);
	foreach (var security in entityRegistry.Securities)
		TryAddToCache(security);
		_underlyingStorage = underlyingStorage;
	}
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Т.к. интерфейс ISecurityStorage не позволяет читать данные из кэша underlyingStorage,&lt;br /&gt;для построения особого &amp;quot;финамовского&amp;quot; кэша снова зачитываются данные напрямую из хранилища,&lt;br /&gt;что не очень-то быстро.&lt;br /&gt;Стоит ли вносить методы работы с кэшами в ISecurityStorage или выделить особый интерфейс для этого,&lt;br /&gt;скажем &amp;quot;ICachedSecurityStorage&amp;quot;, я сказать не могу - это дело архитекторов StockSharp,&lt;br /&gt;но можно сделать вот такой &amp;quot;костыль&amp;quot;:&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;

public FinamSecurityStorage(ISecurityStorage underlyingStorage, HydraEntityRegistry entityRegistry)
{
	if (underlyingStorage == null)
		throw new ArgumentNullException(&amp;quot;underlyingStorage&amp;quot;);
	_underlyingStorage = underlyingStorage;
	if (underlyingStorage is SecurityStorage)
	{
		foreach (var security in ((SecurityStorage)_underlyingStorage).CachedSecurities)
			TryAddToCache(security);
		((SecurityStorage)_underlyingStorage).Reloaded += OnReloaded;
	}
	else
	{
		foreach (var security in entityRegistry.Securities)
			TryAddToCache(security);
	}
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Т.к. в случае Гидры underlyingStorage относится к классу SecurityStorage, этот код быстро код данные из имеющегося кэша.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&lt;/b&gt; Старт импорта маркет-данных происходит долго из-за следующиего кода в классе Worker:&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;

public bool Start(IEnumerable&amp;lt;VisualSecurity&amp;gt; securities)
{
	...
	_securities.Clear();

	foreach (var group in securities.GroupBy(s =&amp;gt; s.TradeInfo.Source)
		.Concat(securities.GroupBy(s =&amp;gt; s.DepthInfo.Source))
		.Concat(securities.GroupBy(s =&amp;gt; s.OrderLogInfo.Source))
		.Concat(securities.GroupBy(s =&amp;gt; s.SecurityChangeInfo.Source))
		.Concat(securities.GroupBy(s =&amp;gt; s.CandleInfo.Source))
		.Where(g =&amp;gt; !g.Key.IsEmpty()))
		{
			_securities.SafeAdd(group.Key).AddRange(group);
		}
	...
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Здесь проблема заключается в том, что при каждом вызове securities.GroupBy происходит повторный перебор securities.&lt;br /&gt;За счет того, что построение securities заключается в чтении их напрямую из хранилища здесь мы получаем ударную дозу&lt;br /&gt;из 5 подряд чтений из хранилища, что и приводит к превышению довольно солидного тайм-аута при старте.&lt;br /&gt;&lt;br /&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;

public bool Start(IEnumerable&amp;lt;VisualSecurity&amp;gt; securities)
{
	...
	_securities.Clear();

	var securitiesArray = securities.ToArray();

	foreach (var group in securitiesArray.GroupBy(s =&amp;gt; s.TradeInfo.Source)
		.Concat(securitiesArray.GroupBy(s =&amp;gt; s.DepthInfo.Source))
		.Concat(securitiesArray.GroupBy(s =&amp;gt; s.OrderLogInfo.Source))
		.Concat(securitiesArray.GroupBy(s =&amp;gt; s.SecurityChangeInfo.Source))
		.Concat(securitiesArray.GroupBy(s =&amp;gt; s.CandleInfo.Source))
		.Where(g =&amp;gt; !g.Key.IsEmpty()))
		{
			_securities.SafeAdd(group.Key).AddRange(group);
		}
	...
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; Но, собственно, почему в метод Start передается IEnumerable&amp;lt;VisualSecurity&amp;gt;,&lt;br /&gt;который приводит к чтению из хранилища, а не из кэша?&lt;br /&gt;Собственно код в методе StartStopClick класса MainWindow такой (в методе AutoStart аналогичный):&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;

var selectedSecurities = _entityRegistry.Securities.Select(s =&amp;gt; s.ToVisualSecurity()).Where(s =&amp;gt; s.IsSelected);

if (_worker.Start(selectedSecurities))
{
	...
}
else
{
	...
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&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;

var selectedSecurities = _securityStorage.CachedSecurities
	.Where(s =&amp;gt; s.IsSelected())
	.Select(s =&amp;gt; s.ToVisualSecurity())
	.ToArray();
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;В принципе, если бы код был написан сразу так, то оптимизация номер 2 с GroupBy даже не нужна.&lt;br /&gt;Но, имхо, правильнее сделать и то, и другое.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&lt;/b&gt; Еще невыносимо долго при большом числе инструментов переключаются вкладки.&lt;br /&gt;Код построения всех выбранных интрументов в классе MarketDataSourceControl такой:&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;

private void FillSecurities()
{
	var selectedSource = Source.Name;
	var storage = HydraEntityRegistry;

	SecuritiesCtrl.Securities.Clear();
	_selectedSecurities.Clear();

	System.Windows.Input.Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
	System.Threading.Tasks.Task.Factory.StartNew(
		() =&amp;gt; 
		{
			var securities = storage
				.Securities
				.Select(s =&amp;gt; s.ToVisualSecurity()).Where(s =&amp;gt; s.IsSelected &amp;amp;&amp;amp; (selectedSource == null || (s.TradeInfo.Source == selectedSource ||
					s.DepthInfo.Source == selectedSource || s.OrderLogInfo.Source == selectedSource || s.SecurityChangeInfo.Source == selectedSource || 
					s.Source == selectedSource || s.CandleInfo.Source == selectedSource)));

			_selectedSecurities.AddRange(securities);
		})
		.ContinueWith(sec =&amp;gt;
		{
			...
		}, System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext());
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Недостаток здесь такой же - чтение данных напрямую из хранилища.&lt;br /&gt;Видимо для того, чтобы при этом не тормозило само переключение вкладки, чтение вынесено в отдельный поток.&lt;br /&gt;&lt;br /&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;

private void FillSecurities()
{
	var selectedSource = Source.Name;

	SecuritiesCtrl.Securities.Clear();
	_selectedSecurities.Clear();

	var securities = SecurityStorage.CachedSecurities
			.Where(s =&amp;gt; s.IsSelected())
			.Select(s =&amp;gt; s.ToVisualSecurity()).Where(s =&amp;gt;selectedSource == null || (s.TradeInfo.Source == selectedSource ||
				s.DepthInfo.Source == selectedSource || s.OrderLogInfo.Source == selectedSource || s.SecurityChangeInfo.Source == selectedSource ||
				s.Source == selectedSource || s.CandleInfo.Source == selectedSource));

	_selectedSecurities.AddRange(securities);

	...
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Так как из кэша все берется быстро, да и чтобы не возиться с GUI-синхронизацией, я разобрал использование отдельного потока.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&lt;/b&gt; Последний нюанс, который вызвал у меня сомнения: зачем при старте импорта маркет-данных обновляются инструменты?&lt;br /&gt;Необходимость этого я себе объяснить не смог, поэтому поменял этот код в классе MarketDataTrader:&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;

public void Start()
{
	Trader = _createTrader();

	try
	{
		...
		
		Trader.SecuritiesChanged += OnSecuritiesChanged;

		using (var su = new SecurityUpdate(Trader))
		{
			Trader.Connect();

			lock (_connectedLock)
			{
				if (!Trader.IsConnected &amp;amp;&amp;amp; !Monitor.Wait(_connectedLock, TimeSpan.FromSeconds(20)))
					throw new TimeoutException(&amp;quot;Ожидание подключения превысило максимально допустимый интервал.&amp;quot;);
			}

			su.Wait();
		}
	}
	catch
	{
		...
	}
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&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;

public void Start(bool updateSecurities = false)
{
	Trader = _createTrader();

	try
	{
		...
		
		Trader.SecuritiesChanged += OnSecuritiesChanged;

		if (updateSecurities)
		{
			using (var su = new SecurityUpdate(Trader))
			{
				Trader.Connect();

				lock (_connectedLock)
				{
					if (!Trader.IsConnected &amp;amp;&amp;amp; !Monitor.Wait(_connectedLock, TimeSpan.FromSeconds(20)))
						throw new TimeoutException(&amp;quot;Ожидание подключения превысило максимально допустимый интервал.&amp;quot;);
				}

				su.Wait();
			}
		}
		else
		{
			Trader.Connect();

			lock (_connectedLock)
			{
				if (!Trader.IsConnected &amp;amp;&amp;amp; !Monitor.Wait(_connectedLock, TimeSpan.FromSeconds(20)))
					throw new TimeoutException(&amp;quot;Ожидание подключения превысило максимально допустимый интервал.&amp;quot;);
			}
		}
	}
	catch
	{
		...
	}
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;При этом причем updateSecurities == true только при запуске из метода MarketDataTrader.GetNewSecurities.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вот такие оптимизации я сделал в своей Гидре версии 4.1.3.&lt;br /&gt;Предлагаю разработчикам StockSharp высказать свое мнение по поводу предложенных изменений и внести удачные в Гидру.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>