﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Блокирование потока в методе AddInfoLog()</title>
  <id>~/topic/2464/blokirovanie-potoka-v-metode-addinfolog()/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-06-21T13:29:56Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=2464" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/17004/</id>
    <title type="text">Mikhail Sukhov: ra81: Нет, используется релизная 4.0.20 4.0 не удастся поддержать. Новый коннектор р...</title>
    <published>2012-03-07T12:52:01Z</published>
    <updated>2012-03-07T12:52:01Z</updated>
    <author>
      <name>ra81</name>
      <uri>https://stocksharp.com/users/16581/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(16993)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(16991)" rel="nofollow" target="_blank"&gt;ra81&lt;/a&gt;:&lt;/strong&gt;
Нет, используется релизная 4.0.20&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;4.0 не удастся поддержать. Новый коннектор разве не в дев ветке разрабатывается?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Вообще да, но я использую релизные либы. В принципе разобрался в чем проблема, благодаря положительному влияюнию Сергея на мою мозговую деятельность. Проблема очевидно была в том что главный поток блокировался, в результате блокировалось окно логгера. В лог нельзя было ничего написать, отсюда блокировался поток обрабатывающий данные. Взаимная блокировка.&lt;/p&gt;
&lt;p&gt;Переписал часть классов, использовал спец. коллекции. Убрал не очень хорошо пахнущие блокировки. Код стал лучше и глюкать перестал. Проблему можно закрыть.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/16993/</id>
    <title type="text">ra81: Нет, используется релизная 4.0.20 4.0 не удастся поддержать. Новый коннектор разве не в дев ве...</title>
    <published>2012-03-07T11:19:29Z</published>
    <updated>2012-03-07T11:19:29Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(16991)" rel="nofollow" target="_blank"&gt;ra81&lt;/a&gt;:&lt;/strong&gt;
Нет, используется релизная 4.0.20&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;4.0 не удастся поддержать. Новый коннектор разве не в дев ветке разрабатывается?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/16991/</id>
    <title type="text">Mikhail Sukhov: ra81: Суть проблемы: Если запустить экспорт и сразу же остановить, зависает вся сист...</title>
    <published>2012-03-07T11:17:22Z</published>
    <updated>2012-03-07T11:17:22Z</updated>
    <author>
      <name>ra81</name>
      <uri>https://stocksharp.com/users/16581/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(16987)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(16981)" rel="nofollow" target="_blank"&gt;ra81&lt;/a&gt;:&lt;/strong&gt;
&lt;strong&gt;Суть проблемы:&lt;/strong&gt;
Если запустить экспорт и сразу же остановить, зависает вся система. Путем разбора полетов было выяснено что блокируется поток внутри метода AddInfoLog(). В итоге завершить остановку экспорта получается невозможно. Для логгирования используется GuiLogListener&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;4.1? Там появился GuiDispatcher, проставляется в GuiLogListener. Его лучше использовать. Он и асинхронен, и быстрее маршалинг делает.
Нет, используется релизная 4.0.20&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/16987/</id>
    <title type="text">ra81: Суть проблемы: Если запустить экспорт и сразу же остановить, зависает вся система. Путем разбо...</title>
    <published>2012-03-07T11:03:59Z</published>
    <updated>2012-03-07T11:03:59Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(16981)" rel="nofollow" target="_blank"&gt;ra81&lt;/a&gt;:&lt;/strong&gt;
&lt;strong&gt;Суть проблемы:&lt;/strong&gt;
Если запустить экспорт и сразу же остановить, зависает вся система. Путем разбора полетов было выяснено что блокируется поток внутри метода AddInfoLog(). В итоге завершить остановку экспорта получается невозможно. Для логгирования используется GuiLogListener&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;4.1? Там появился GuiDispatcher, проставляется в GuiLogListener. Его лучше использовать. Он и асинхронен, и быстрее маршалинг делает.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/16981/</id>
    <title type="text">Суть проблемы: Если запустить экспорт и сразу же остановить, зависает вся система. Путем разбора пол...</title>
    <published>2012-03-07T09:49:39Z</published>
    <updated>2012-03-07T10:11:55Z</updated>
    <author>
      <name>ra81</name>
      <uri>https://stocksharp.com/users/16581/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;p&gt;&lt;strong&gt;Суть проблемы:&lt;/strong&gt;
Если запустить экспорт и сразу же остановить, зависает вся система. Путем разбора полетов было выяснено что блокируется поток внутри метода AddInfoLog(). В итоге завершить остановку экспорта получается невозможно. Для логгирования используется GuiLogListener&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Подробности:&lt;/strong&gt;
Ошибка возникает в версии AlfaPlus. Данную версию я еще не публиковал. Допиливаю. В ней реализованы следующие моменты:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Данные от терминала поступают сначала в очередь. А потом из очереди забираются отдельным Task который очередь мониторит и обрабатывает.&lt;/li&gt;
&lt;li&gt;Данные от монитора очереди поступают в обертку для таблиц, которая поддерживает подписку на данные и отписку от получения данных. В этой таблице своя очередь, которая так же обрабатывается своим Task. На каждую таблицу данных имеем свою обертку и свой Task.&lt;/li&gt;
&lt;li&gt;Методы подписки на таблицу, отписки, и рассылки данных подписчикам реализованы через блокировки. То есть когда происходит подписка, блокируется рассылка данных и отписка от таблиц, и наоборот.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;По факту имеем следующую проблему. Когда запустили экспорт StartExport(), в таблицу попадает порция данных и начинает обрабатываться, а затем рассылаться подписчикам. Поскольку процес включения подписки уже успевает закончиться к моменту начала рассылки данных, основной поток переходит к методу остановки экспорта StopExport(). Основной поток переходит к методу отписки от таблицы. В это же время Task этой же таблицы, отвечающий за обработку данных и рассылку по подписчикам, начинает передавать данные в подписчики. И первым делом в методе обработки данных подписчика вызывается запись в лог AddInfoLog(). Вот на этой записи и встает колом поток. А поскольку реализована блокировка при рассылке данных в подписчики, блокировка НЕ освобождается. ОТсюда метод отписки не может получить объект блокировки и тоже встает колом.&lt;/p&gt;
&lt;p&gt;Дальнейшие изыскания привели к методу класса GuiLogListener:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;protected override void OnWriteMessage(LogMessage message)
{
    var listener = _listener ?? _windows.SafeAdd(message.Source, s =&amp;gt; _dispatcher.GuiSync(() =&amp;gt;
    {
        var w = new LogWindow { Title = s.ToString() };
        w.Show();
        return w;
    }));
    Action action = () =&amp;gt; listener.WriteMessage(message);

    if (_dispatcher != null)
        _dispatcher.GuiSync(action); // &amp;lt;------ вот тут колом все и встает.
    else
        action();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Если посмотреть где окончательно встает колом поток, то получаем такую картину вызовов:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-plain"&gt;System.Threading.WaitHandle.WaitOne(System.TimeSpan timeout, bool exitContext)

System.Windows.Threading.DispatcherOperation.DispatcherOperationEvent.WaitOne()
System.Windows.Threading.DispatcherOperation.Wait(System.TimeSpan timeout)

System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority priority, System.TimeSpan timeout, System.Delegate method, object args, int numArgs)

System.Windows.Threading.Dispatcher.Invoke(System.Delegate method, System.Windows.Threading.DispatcherPriority priority, object[] args)

Ecng.Xaml.XamlHelper.GuiSync(System.Windows.Threading.Dispatcher dispatcher, System.Action action, System.Windows.Threading.DispatcherPriority priority)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Из коннектора никаких выводов не может идти кроме вывода StopExport() и this.AddInfoLog(&amp;quot;OnProcessSecurities {0}&amp;quot;, data.ToString());
Это проверено. То есть либо конфликт происходит между этими двумя элементами лога или не знаю что сказать. Не понял еще в каком потоке заводится окно логгера. Если в том же что и основное окно тогда все ясно.&lt;/p&gt;
&lt;p&gt;Нашел еще один подозрительный поток который связан с логами. Он висит на следующем коде&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;class AsyncFlushList&amp;lt;TItem&amp;gt; : SynchronizedCollection&amp;lt;TItem&amp;gt;
{...
...
private void Flush(IEnumerable&amp;lt;TItem&amp;gt; items)
{
    _isAddRange = true;
    try
    {
        items.ForEach(Add);
    }
    finally
    {
         _isAddRange = false;
    }

    _parent.GuiSync(() =&amp;gt; _added(items)); // &amp;lt;---- висим тут.
}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Очередь вызовов в общем схожая. Метод ждет освобождения блокировки.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>