﻿<?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">Библиотека 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-06-07T04:21:32Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=1160" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/4090/</id>
    <title type="text">У меня происходит следующее: Я создаю заявку Order1 в Потоке1. Отменяю Order1 в Потоке1. После отмен...</title>
    <published>2010-10-06T13:39:39Z</published>
    <updated>2016-08-16T02:32:26Z</updated>
    <author>
      <name>Maxim</name>
      <uri>https://stocksharp.ru/users/6182/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;У меня происходит следующее:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Я создаю заявку Order1 в Потоке1.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Отменяю Order1 в Потоке1.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;После отмены заявки срабатывает событие ProcessDataError в Потоке2.
Об этом я писал здесь: &lt;a href="http://stocksharp.com/forum/1154/"&gt;Событие BaseTrader.ProcessDataError выдает сообщение о снятии заявки.&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Событие ProcessDataError вызывает Метод в Потоке2, который ждет определенного условия.
То есть некоторое время не освобождает Поток2.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;А в это время создается заявка Order2 в Потоке1.
Не смотря на то, что эта заявка появилась в Квике, Id в Order2
остается равным 0. Так же не возникает события NewOrders.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Если в 4 пункте сразу освобождать событие ProcessDataError ,
то в 5 пункте все происходит как обычно: и Id появляется и NewOrders срабатывает.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/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.ru/users/6182/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Спасибо за ответ.&lt;/p&gt;
&lt;p&gt;Насчет многопоточности написано вот здесь хорошо:
&lt;a href="http://www.albahari.com/threading/" rel="nofollow" target="_blank"&gt;http://www.albahari.com/threading/&lt;/a&gt;&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/4138/</id>
    <title type="text">Maxim: То есть вышеописанное поведение — нормальное? Нормальное. Ваша ситуация называется deadlock (...</title>
    <published>2010-10-08T19:56:43Z</published>
    <updated>2010-10-08T19:56:43Z</updated>
    <author>
      <name>Иванов Андрей</name>
      <uri>https://stocksharp.ru/users/28064/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Maxim:&lt;/strong&gt;
То есть вышеописанное поведение — нормальное?
Нормальное. Ваша ситуация называется deadlock (взаимная блокировка). Увеличение количества активных потоков просто оттянет конец.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Не совсем понял, в каких случаях события вызываются взаимосвязано, а в каких нет?
Если не сложно, можете еще раз пояснить, для более четкого представления?
Закладываться на такие вещи нельзя. Сегодня взаимосвязано что-то одно, завтра что-то другое.
Синхронно пользоваться ивентами (из System.Threading, например, AutoResetEvent) можно только в одном случае -- у вас есть один отдельный поток, созданный вами и который что-то делает в ответ на какие-то события. Во всех остальных случаях нарваться на дедлок очень легко. Что вы и сделали.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Почему не вызывать ProcessDataError асинхронно?
&amp;quot;Асинхронно&amp;quot; и &amp;quot;другой поток&amp;quot; не синонимы. Асинхронно это без блокирования потока на не-CPU операции с неопределённым или большим временем исполнения. Исполнение метода в другом потоке это параллельное исполнение.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;С точки зрения обывателя разницы между параллельным исполнением и асинхронным может быть нет. А с точки зрения системы есть. Реальный асинхронный вызов реализуется через IO поток, который ждёт на WaitHandle. Поэтому когда вы якобы асинхронно запускаете исполнение метода через BeginInvoke, и висите там на WaitHandle, вы просто оттягиваете дедлок и прячете его. Где читать рекомендации по пользованию ThreadPool я не знаю, но уверен, что таких мест полно.&lt;/p&gt;
&lt;p&gt;Если я не ошибся и вы сидите в обработчике события на WaitHandle, советую обратить внимание не на BeginInvoke, который нужен для запуска CPU-задач, а на RegisterWaitForSingleObject, который как раз и предназначен для асинхронного реагирования на события. То есть, без блокирования активного потока. Если же ошибся, то советую вам перейти на реализацию, которую описал выше, потому что иначе намучаетесь.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Может в мануале сделать раздел FAQ? Что бы Вам туда постить ответы из форума.
Если имеется в виду конкретно данная тема, то в фак стоит добавить ссылку на книгу Рихтера, например. Только кто ж её читать будет -- очень уж длинный фак получается =)
Просто таких вопросов триллиард и они не про S#, а про азы многопоточного программирования.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/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.ru/users/6182/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Убрать ожидание скорей всего смогу (сделаю свой BeginInvoke).&lt;/p&gt;
&lt;p&gt;То есть вышеописанное поведение — нормальное?&lt;/p&gt;
&lt;p&gt;Не совсем понял, в каких случаях события вызываются взаимосвязано, а в каких нет?
Если не сложно, можете еще раз пояснить, для более четкого представления?
Почему не вызывать ProcessDataError асинхронно?&lt;/p&gt;
&lt;p&gt;Может в мануале сделать раздел FAQ? Что бы Вам туда постить ответы из форума.&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/4094/</id>
    <title type="text">Maxim: У меня происходит следующее: А в это время создается заявка 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.ru/users/201/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Maxim:&lt;/strong&gt;
У меня происходит следующее:&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;А в это время создается заявка Order2 в Потоке1.
Не смотря на то, что эта заявка появилась в Квике, Id в Order2
остается равным 0. Так же не возникает события NewOrders.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Да, так как у Вас событие NewOrders &amp;quot;висит&amp;quot; при первом вызове ProcessDataError, то данные по ДДЕ не обрабатываются по заявкам. Может убрать ожидание в обработчике ошибок?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/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.ru/users/201/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Каждое событие вызывается с своем потоке. Но, например, если событие новых сделок (NewMyTrades) привело к ошибке, то будет вызвано ProcessDataError в том потоке, в котором оно было инициировано. Соответственно, NewMyTrades не будет вызван до тех пор, ка освободиться ProcessDataError. Другие события будут работать.&lt;/p&gt;
&lt;p&gt;То, что ID не заполняется - вряд ли. Надо конкретнее разбираться. Потому что все данные накапливаются в очереди, и ничего не теряется. ID сделки - это какое поле вы имеет ввиду (+ какой класс)?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/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.ru/users/6182/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">&lt;p&gt;Михаил, добрый день.&lt;/p&gt;
&lt;p&gt;Экспериментальным путем установил, что пока не закончит работу метод,
который подписан на событие ProcessDataError, остальные события библиотека
не производит. Так же не назначается Id сделке, если сделка была подана
в то время, когда событие ProcessDataError было «подвешено».&lt;/p&gt;
&lt;p&gt;Из этого могу предположить, что события из библиотеки вызываются синхронным образом.&lt;/p&gt;
&lt;p&gt;Вопросы:
Все ли события вызываются синхронно или только ProcessDataError?
Это баг или фича, и если баг, то будет ли он исправлен (исправлено на асинхронные вызовы)?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>