﻿<?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">Блокирование потока в методе AddInfoLog()</title>
  <id>~/topic/2464/blokirovanie-potoka-v-metode-addinfolog()/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-06T09:07:36Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=2464" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/17004/</id>
    <title type="text">Нет, используется релизная 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.ru/users/16581/</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/16993/" 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;ra81 &lt;a href="https://stocksharp.ru/posts/m/16991/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Нет, используется релизная 4.0.20&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;4.0 не удастся поддержать. Новый коннектор разве не в дев ветке разрабатывается?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Вообще да, но я использую релизные либы. В принципе разобрался в чем проблема, благодаря положительному влияюнию Сергея на мою мозговую деятельность. Проблема очевидно была в том что главный поток блокировался, в результате блокировалось окно логгера. В лог нельзя было ничего написать, отсюда блокировался поток обрабатывающий данные. Взаимная блокировка.&lt;br /&gt;&lt;br /&gt;Переписал часть классов, использовал спец. коллекции. Убрал не очень хорошо пахнущие блокировки. Код стал лучше и глюкать перестал. Проблему можно закрыть.&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/16993/</id>
    <title type="text">Нет, используется релизная 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.ru/users/201/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;ra81 &lt;a href="https://stocksharp.ru/posts/m/16991/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;Нет, используется релизная 4.0.20&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;4.0 не удастся поддержать. Новый коннектор разве не в дев ветке разрабатывается?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/16991/</id>
    <title type="text">Суть проблемы: Если запустить экспорт и сразу же остановить, зависает вся система. Путем разбора пол...</title>
    <published>2012-03-07T11:17:22Z</published>
    <updated>2012-03-07T11:17:22Z</updated>
    <author>
      <name>ra81</name>
      <uri>https://stocksharp.ru/users/16581/</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/16987/" 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;ra81 &lt;a href="https://stocksharp.ru/posts/m/16981/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;b&gt;Суть проблемы:&lt;/b&gt;&lt;br /&gt;Если запустить экспорт и сразу же остановить, зависает вся система. Путем разбора полетов было выяснено что блокируется поток внутри метода AddInfoLog(). В итоге завершить остановку экспорта получается невозможно. Для логгирования используется GuiLogListener&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;4.1? Там появился GuiDispatcher, проставляется в GuiLogListener. Его лучше использовать. Он и асинхронен, и быстрее маршалинг делает.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Нет, используется релизная 4.0.20</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/16987/</id>
    <title type="text">Суть проблемы: Если запустить экспорт и сразу же остановить, зависает вся система. Путем разбора пол...</title>
    <published>2012-03-07T11:03:59Z</published>
    <updated>2012-03-07T11:03:59Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.ru/users/201/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;ra81 &lt;a href="https://stocksharp.ru/posts/m/16981/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;b&gt;Суть проблемы:&lt;/b&gt;&lt;br /&gt;Если запустить экспорт и сразу же остановить, зависает вся система. Путем разбора полетов было выяснено что блокируется поток внутри метода AddInfoLog(). В итоге завершить остановку экспорта получается невозможно. Для логгирования используется GuiLogListener&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;4.1? Там появился GuiDispatcher, проставляется в GuiLogListener. Его лучше использовать. Он и асинхронен, и быстрее маршалинг делает.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/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.ru/users/16581/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;b&gt;Суть проблемы:&lt;/b&gt;&lt;br /&gt;Если запустить экспорт и сразу же остановить, зависает вся система. Путем разбора полетов было выяснено что блокируется поток внутри метода AddInfoLog(). В итоге завершить остановку экспорта получается невозможно. Для логгирования используется GuiLogListener&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Подробности:&lt;/b&gt;&lt;br /&gt;Ошибка возникает в версии AlfaPlus. Данную версию я еще не публиковал. Допиливаю. В ней реализованы следующие моменты:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Данные от терминала поступают сначала в очередь. А потом из очереди забираются отдельным Task который очередь мониторит и обрабатывает.&lt;br /&gt;&lt;li&gt; Данные от монитора очереди поступают в обертку для таблиц, которая поддерживает подписку на данные и отписку от получения данных. В этой таблице своя очередь, которая так же обрабатывается своим Task. На каждую таблицу данных имеем свою обертку и свой Task.&lt;br /&gt;&lt;li&gt; Методы подписки на таблицу, отписки, и рассылки данных подписчикам реализованы через блокировки. То есть когда происходит подписка, блокируется рассылка данных и отписка от таблиц, и наоборот.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;По факту имеем следующую проблему. Когда запустили экспорт StartExport(), в таблицу попадает порция данных и начинает обрабатываться, а затем рассылаться подписчикам. Поскольку процес включения подписки уже успевает закончиться к моменту начала рассылки данных, основной поток переходит к методу остановки экспорта StopExport(). Основной поток переходит к методу отписки от таблицы. В это же время Task этой же таблицы, отвечающий за обработку данных и рассылку по подписчикам, начинает передавать данные в подписчики. И первым делом в методе обработки данных подписчика вызывается запись в лог AddInfoLog(). Вот на этой записи и встает колом поток. А поскольку реализована блокировка при рассылке данных в подписчики, блокировка НЕ освобождается. ОТсюда метод отписки не может получить объект блокировки и тоже встает колом.&lt;br /&gt;&lt;br /&gt;Дальнейшие изыскания привели к методу класса GuiLogListener:&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;
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;/pre&gt;
&lt;/div&gt;&lt;/div&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: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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Из коннектора никаких выводов не может идти кроме вывода StopExport() и this.AddInfoLog(&amp;quot;OnProcessSecurities {0}&amp;quot;, data.ToString());&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;
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;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Очередь вызовов в общем схожая. Метод ждет освобождения блокировки.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>