﻿<?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">Библиотека S# вызывает событие ProcessDataError синхронно.</title>
  <id>~/topic/1160/biblioteka-s-vyzyvaet-sobytie-processdataerror-sinhronno_/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-07T02:44:48Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=1160" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/4090/</id>
    <title type="text">У меня происходит следующее: 1) Я создаю заявку Order1 в Потоке1. 2) Отменяю Order1 в Потоке1. 3) По...</title>
    <published>2010-10-06T13:39:39Z</published>
    <updated>2016-08-16T02:32:26Z</updated>
    <author>
      <name>Maxim</name>
      <uri>https://stocksharp.com/users/6182/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">У меня происходит следующее:&lt;br /&gt;&lt;br /&gt;1) Я создаю заявку Order1 в Потоке1.&lt;br /&gt;&lt;br /&gt;2) Отменяю Order1 в Потоке1.&lt;br /&gt;&lt;br /&gt;3) После отмены заявки срабатывает событие ProcessDataError в Потоке2.&lt;br /&gt;     Об этом я писал здесь: &lt;a href="http://stocksharp.com/forum/1154/" title="http://stocksharp.com/forum/1154/"&gt;Событие BaseTrader.ProcessDataError выдает сообщение о снятии заявки.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4) Событие ProcessDataError вызывает Метод в Потоке2, который ждет определенного условия.&lt;br /&gt;   То есть некоторое время не освобождает Поток2.&lt;br /&gt;&lt;br /&gt;5) А в это время создается заявка Order2 в Потоке1.&lt;br /&gt;    Не смотря на то, что эта заявка появилась в Квике, Id в Order2&lt;br /&gt;    остается равным 0. Так же не возникает события NewOrders.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Если в 4 пункте сразу освобождать событие ProcessDataError ,&lt;br /&gt;то в 5 пункте все происходит как обычно: и Id появляется и NewOrders срабатывает.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/4173/</id>
    <title type="text">Спасибо за ответ. Насчет многопоточности написано вот здесь хорошо: http://www.albahari.com/threadin...</title>
    <published>2010-10-12T14:18:00Z</published>
    <updated>2010-10-12T14:18:00Z</updated>
    <author>
      <name>Maxim</name>
      <uri>https://stocksharp.com/users/6182/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Спасибо за ответ.&lt;br /&gt;&lt;br /&gt;Насчет многопоточности написано вот здесь хорошо:&lt;br /&gt;&lt;a target="_blank" rel="nofollow" href="https://stocksharp.com/away/?u=AQAAAAAAAACHggKlj8a1_eCG4S3IT_kJGgHBd1SMkhH2qKiP7hSI5ehON0cj3DrSpEz0YRCt4zg" title="http://www.albahari.com/threading/"&gt;http://www.albahari.com/threading/&lt;/a&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/4138/</id>
    <title type="text">То есть вышеописанное поведение — нормальное? Нормальное. Ваша ситуация называется deadlock (взаимна...</title>
    <published>2010-10-08T19:56:43Z</published>
    <updated>2010-10-08T19:56:43Z</updated>
    <author>
      <name>Иванов Андрей</name>
      <uri>https://stocksharp.com/users/28064/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Maxim&lt;/span&gt;&lt;div class="innerquote"&gt;То есть вышеописанное поведение — нормальное?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Нормальное. Ваша ситуация называется deadlock (взаимная блокировка). Увеличение количества активных потоков просто оттянет конец.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;Не совсем понял, в каких случаях события вызываются взаимосвязано, а в каких нет?&lt;br /&gt;Если не сложно, можете еще раз пояснить, для более четкого представления?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Закладываться на такие вещи нельзя. Сегодня взаимосвязано что-то одно, завтра что-то другое.&lt;br /&gt;Синхронно пользоваться ивентами (из System.Threading, например, AutoResetEvent) можно только в одном случае -- у вас есть один отдельный поток, созданный вами и который что-то делает в ответ на какие-то события. Во всех остальных случаях нарваться на дедлок очень легко. Что вы и сделали.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;Почему не вызывать ProcessDataError асинхронно?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&amp;quot;Асинхронно&amp;quot; и &amp;quot;другой поток&amp;quot; не синонимы. Асинхронно это без блокирования потока на не-CPU операции с неопределённым или большим временем исполнения. Исполнение метода в другом потоке это параллельное исполнение.&lt;br /&gt;&lt;br /&gt;С точки зрения обывателя разницы между параллельным исполнением и асинхронным может быть нет. А с точки зрения системы есть. Реальный асинхронный вызов реализуется через IO поток, который ждёт на WaitHandle. Поэтому когда вы якобы асинхронно запускаете исполнение метода через BeginInvoke, и висите там на WaitHandle, вы просто оттягиваете дедлок и прячете его. Где читать рекомендации по пользованию ThreadPool я не знаю, но уверен, что таких мест полно.&lt;br /&gt;&lt;br /&gt;Если я не ошибся и вы сидите в обработчике события на WaitHandle, советую обратить внимание не на BeginInvoke, который нужен для запуска CPU-задач, а на RegisterWaitForSingleObject, который как раз и предназначен для асинхронного реагирования на события. То есть, без блокирования активного потока. Если же ошибся, то советую вам перейти на реализацию, которую описал выше, потому что иначе намучаетесь.&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;Может в мануале сделать раздел FAQ? Что бы Вам туда постить ответы из форума.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Если имеется в виду конкретно данная тема, то в фак стоит добавить ссылку на книгу Рихтера, например. Только кто ж её читать будет -- очень уж длинный фак получается =)&lt;br /&gt;Просто таких вопросов триллиард и они не про S#, а про азы многопоточного программирования.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/4095/</id>
    <title type="text">Убрать ожидание скорей всего смогу (сделаю свой BeginInvoke). То есть вышеописанное поведение — норм...</title>
    <published>2010-10-06T15:08:31Z</published>
    <updated>2010-10-06T15:08:31Z</updated>
    <author>
      <name>Maxim</name>
      <uri>https://stocksharp.com/users/6182/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Убрать ожидание скорей всего смогу (сделаю свой BeginInvoke).&lt;br /&gt;&lt;br /&gt;То есть вышеописанное поведение — нормальное?&lt;br /&gt;&lt;br /&gt;Не совсем понял, в каких случаях события вызываются взаимосвязано, а в каких нет?&lt;br /&gt;Если не сложно, можете еще раз пояснить, для более четкого представления?&lt;br /&gt;Почему не вызывать ProcessDataError асинхронно?  &lt;br /&gt;&lt;br /&gt;Может в мануале сделать раздел FAQ? Что бы Вам туда постить ответы из форума.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/4094/</id>
    <title type="text">У меня происходит следующее: 5) А в это время создается заявка Order2 в Потоке1. Не смотря на то, чт...</title>
    <published>2010-10-06T14:57:28Z</published>
    <updated>2010-10-06T14:57:28Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Maxim&lt;/span&gt;&lt;div class="innerquote"&gt;У меня происходит следующее:&lt;br /&gt;&lt;br /&gt;5) А в это время создается заявка Order2 в Потоке1.&lt;br /&gt;    Не смотря на то, что эта заявка появилась в Квике, Id в Order2&lt;br /&gt;    остается равным 0. Так же не возникает события NewOrders.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Да, так как у Вас событие NewOrders &amp;quot;висит&amp;quot; при первом вызове ProcessDataError, то данные по ДДЕ не обрабатываются по заявкам. Может убрать ожидание в обработчике ошибок?&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/4089/</id>
    <title type="text">Каждое событие вызывается с своем потоке. Но, например, если событие новых сделок (NewMyTrades) прив...</title>
    <published>2010-10-06T13:01:19Z</published>
    <updated>2010-10-06T13:01:19Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Каждое событие вызывается с своем потоке. Но, например, если событие новых сделок (NewMyTrades) привело к ошибке, то будет вызвано ProcessDataError в том потоке, в котором оно было инициировано. Соответственно, NewMyTrades не будет вызван до тех пор, ка освободиться ProcessDataError. Другие события будут работать.&lt;br /&gt;&lt;br /&gt;То, что ID не заполняется - вряд ли. Надо конкретнее разбираться. Потому что все данные накапливаются в очереди, и ничего не теряется. ID сделки - это какое поле вы имеет ввиду (+ какой класс)?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/4087/</id>
    <title type="text">Михаил, добрый день. Экспериментальным путем установил, что пока не закончит работу метод, который п...</title>
    <published>2010-10-06T10:06:21Z</published>
    <updated>2010-10-06T10:06:21Z</updated>
    <author>
      <name>Maxim</name>
      <uri>https://stocksharp.com/users/6182/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Михаил, добрый день.&lt;br /&gt;&lt;br /&gt;Экспериментальным путем установил, что пока не закончит работу метод, &lt;br /&gt;который подписан на событие ProcessDataError, остальные события библиотека&lt;br /&gt;не производит. Так же не назначается Id сделке, если сделка была подана&lt;br /&gt;в то время, когда событие ProcessDataError было &amp;#171;подвешено&amp;#187;.&lt;br /&gt;&lt;br /&gt;Из этого могу предположить, что события из библиотеки вызываются синхронным образом.&lt;br /&gt;&lt;br /&gt;Вопросы:&lt;br /&gt;Все ли события вызываются синхронно или только ProcessDataError?&lt;br /&gt;Это баг или фича, и если баг, то будет ли он исправлен (исправлено на асинхронные вызовы)?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>