Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проблема с многопоточностью в WCF
|
|||
|---|---|---|---|
|
#18+
Суть вопроса: Клиет вызывает метод, который начинает получать данные из базы данных. В это время клиент начинает (в цикле) метод, возвращающий результат появления данных, которые можно получать в процессе выполнения основного запроса. В случае одиночного клиента все работает без проблем. Когда пытаюсь создать несколько клиентов и выполнить описанное выше, то происходит следующее: первый запущенный клиент деактивируется до тех пор, пока полностью не завершит свои действие второй клиент, потом возвращается к жизни, но уже не может выйти из цикла проверки появления данных. Сделал отладочный лог на сервере, по нему проследил что все необходимые действия выполняются и данные полностью получаются из бд. Почему деактивируется первый запущеный клиент? Пробовал InstanceContextMode.PerSession и ConcurrencyMode.Multiple, не помогло. Подскажите в чем может быть ошибка или хотя бы где ее искать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 17:19 |
|
||
|
Проблема с многопоточностью в WCF
|
|||
|---|---|---|---|
|
#18+
Oleg_Oleg, Попробуй: UseSynchronizationContext=false, ConcurrencyMode = ConcurrencyMode.Multiple ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 18:08 |
|
||
|
Проблема с многопоточностью в WCF
|
|||
|---|---|---|---|
|
#18+
Oleg_Oleg, У меня комбинация атрибутов: [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerSession, UseSynchronizationContext = false)] дает многопоточность сервера при запросе от клиентов, одну инстанцию сервера для клиента пока он подключен, и отсуствие блокировки - лочить надо самостоятельно, если необходимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 18:19 |
|
||
|
Проблема с многопоточностью в WCF
|
|||
|---|---|---|---|
|
#18+
D129Oleg_Oleg, У меня комбинация атрибутов: [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerSession, UseSynchronizationContext = false)] дает многопоточность сервера при запросе от клиентов, одну инстанцию сервера для клиента пока он подключен, и отсуствие блокировки - лочить надо самостоятельно, если необходимо. При установленных UseSynchronizationContext = false и ConcurrencyMode = ConcurrencyMode.Multiple, значение свойства InstanceContextMode уже не имеет значения. Я когда-то для себя создал табличку, описывающую порядок обработки запросов WCF-сервисом, при разных значениях параметров UseSynchronizationContext, ConcurrencyMode, InstanceContextMode. Код: plaintext 1. 2. 3. 4. 5. 6. В таблице: USC - UseSynchronizationContext CM - ConcurrencyMode ICM - InstanceContextMode MClient - MultiClient - условное название ситуации, когда к хосту присоединены несколько клиентов, и они параллельно делают запросы. Плюс означает, что все запросы обрабатываются параллельно, минус - ставятся в очередь. MCall - MultiCall - условное название ситуации, когда один клиент делает несколько параллельных запросов к хосту (из разных потоков, либо методы контракта помечены как IsOneWay). Плюс означает, что все запросы обрабатываются параллельно, минус - ставятся в очередь. Scheme - порядок обработки очереди запросов, в случае когда сначала один клиент делает несколько параллельных запросов, потом второй несколько паралельных: 1-2-1-2 - сначала первый запрос первого клиента, потом первый запрос второго клиента, потом второй запрос первого клиента, потом второй запрос второго клиента и т.д. 1-1-2-2 - сначала обрабатываются все запросы первого клиента, потом все запросы второго клиента и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 18:36 |
|
||
|
Проблема с многопоточностью в WCF
|
|||
|---|---|---|---|
|
#18+
Спасибо за советы. Попробовал UseSynchronizationContext=false, ConcurrencyMode = ConcurrencyMode.Multiple не помогло, первый клиент по-прежнему ждет пока второй не закончит свою работу, хотя по логам видно что первый клиент заканчивает работу раньше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2009, 10:29 |
|
||
|
Проблема с многопоточностью в WCF
|
|||
|---|---|---|---|
|
#18+
Oleg_OlegСпасибо за советы. Попробовал UseSynchronizationContext=false, ConcurrencyMode = ConcurrencyMode.Multiple не помогло, первый клиент по-прежнему ждет пока второй не закончит свою работу, хотя по логам видно что первый клиент заканчивает работу раньше Сделай тестовую версию сервера. Метод обработки первичного запроса клиента замени на длинный Sleep(60*1000), вторичные запросы обрабатывай через Sleep(10*1000). Потом запусти несколько клиентов и посмотри, в каком порядке обрабатываются их запросы. Если запросы от нескольких клиентов обрабатываются параллельно, значит иди дальше. Если какой-то клиент ожидает окончания обработки запроса другого клиента, значит разбирайся в причинах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2009, 11:42 |
|
||
|
Проблема с многопоточностью в WCF
|
|||
|---|---|---|---|
|
#18+
А не может быть причина в использовании Application.DoEvents? Делаю так для обоих вызовов: ....... while(!MyClient.Ready()) { Application.DoEvents(); } ...... Как еще можно реализовать проверку возвращаемого методом значения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2009, 12:10 |
|
||
|
Проблема с многопоточностью в WCF
|
|||
|---|---|---|---|
|
#18+
Oleg_OlegА не может быть причина в использовании Application.DoEvents? Создайте отдельный поток для данных. И не нужны будут эти костыли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2009, 15:27 |
|
||
|
Проблема с многопоточностью в WCF
|
|||
|---|---|---|---|
|
#18+
У меня и так данные на серверной стороне заполняются в потоке. Просто пока они там заполняются, мне нужно проверять доступны ли промежуточные, уже доступные данные. Или я не правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2009, 15:40 |
|
||
|
Проблема с многопоточностью в WCF
|
|||
|---|---|---|---|
|
#18+
Выяснил, что проблема именно в Application.DoEvents. Так как сделал проверку флага в отдельном таймере и все отработало правильно. Подскажите кто знает, как еще можно организовать циклическую проверку при использовании WCF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2009, 12:06 |
|
||
|
Проблема с многопоточностью в WCF
|
|||
|---|---|---|---|
|
#18+
Oleg_OlegВыяснил, что проблема именно в Application.DoEvents. Так как сделал проверку флага в отдельном таймере и все отработало правильно. Подскажите кто знает, как еще можно организовать циклическую проверку при использовании WCFИспользуй асинхронные вызовы. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2009, 15:53 |
|
||
|
|

start [/forum/topic.php?fid=19&msg=36314453&tid=1397804]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
166ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 285ms |

| 0 / 0 |
