powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Проблема с многопоточностью в WCF
12 сообщений из 12, страница 1 из 1
Проблема с многопоточностью в WCF
    #36307344
Oleg_Oleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть вопроса: Клиет вызывает метод, который начинает получать данные из базы данных. В это время клиент начинает (в цикле) метод, возвращающий результат появления данных, которые можно получать в процессе выполнения основного запроса. В случае одиночного клиента все работает без проблем. Когда пытаюсь создать несколько клиентов и выполнить описанное выше, то происходит следующее: первый запущенный клиент деактивируется до тех пор, пока полностью не завершит свои действие второй клиент, потом возвращается к жизни, но уже не может выйти из цикла проверки появления данных. Сделал отладочный лог на сервере, по нему проследил что все необходимые действия выполняются и данные полностью получаются из бд.
Почему деактивируется первый запущеный клиент? Пробовал InstanceContextMode.PerSession и ConcurrencyMode.Multiple, не помогло. Подскажите в чем может быть ошибка или хотя бы где ее искать?
...
Рейтинг: 0 / 0
Проблема с многопоточностью в WCF
    #36307483
Varcom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_Oleg,
Попробуй: UseSynchronizationContext=false, ConcurrencyMode = ConcurrencyMode.Multiple
...
Рейтинг: 0 / 0
Проблема с многопоточностью в WCF
    #36307514
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_Oleg,

У меня комбинация атрибутов:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerSession, UseSynchronizationContext = false)]

дает многопоточность сервера при запросе от клиентов, одну инстанцию сервера для клиента пока он подключен, и отсуствие блокировки - лочить надо самостоятельно, если необходимо.
...
Рейтинг: 0 / 0
Проблема с многопоточностью в WCF
    #36307561
Varcom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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     CM        ICM        MClient MCall Scheme
false   Single    PerCall    +       -
false   Single    PerSession +       -
false   Single    Single     -       -     1-2-1-2*
false   Multiple  <любой>    +       +
true    Single    <любой>    -       -     1-2-1-2
true    Multiple  <любой>    -       -     1-1-2-2
*На каждого клиента выделяется отдельный поток. Все запросы всех киентов, тем не менее, выполняются по очереди.
В таблице:
USC - UseSynchronizationContext
CM - ConcurrencyMode
ICM - InstanceContextMode
MClient - MultiClient - условное название ситуации, когда к хосту присоединены несколько клиентов, и они параллельно делают запросы. Плюс означает, что все запросы обрабатываются параллельно, минус - ставятся в очередь.
MCall - MultiCall - условное название ситуации, когда один клиент делает несколько параллельных запросов к хосту (из разных потоков, либо методы контракта помечены как IsOneWay). Плюс означает, что все запросы обрабатываются параллельно, минус - ставятся в очередь.
Scheme - порядок обработки очереди запросов, в случае когда сначала один клиент делает несколько параллельных запросов, потом второй несколько паралельных:
1-2-1-2 - сначала первый запрос первого клиента, потом первый запрос второго клиента, потом второй запрос первого клиента, потом второй запрос второго клиента и т.д.
1-1-2-2 - сначала обрабатываются все запросы первого клиента, потом все запросы второго клиента и т.д.
...
Рейтинг: 0 / 0
Проблема с многопоточностью в WCF
    #36308451
Oleg_Oleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы.
Попробовал UseSynchronizationContext=false, ConcurrencyMode = ConcurrencyMode.Multiple
не помогло, первый клиент по-прежнему ждет пока второй не закончит свою работу, хотя по логам видно что первый клиент заканчивает работу раньше
...
Рейтинг: 0 / 0
Проблема с многопоточностью в WCF
    #36308739
Varcom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_OlegСпасибо за советы.
Попробовал UseSynchronizationContext=false, ConcurrencyMode = ConcurrencyMode.Multiple
не помогло, первый клиент по-прежнему ждет пока второй не закончит свою работу, хотя по логам видно что первый клиент заканчивает работу раньше
Сделай тестовую версию сервера. Метод обработки первичного запроса клиента замени на длинный Sleep(60*1000), вторичные запросы обрабатывай через Sleep(10*1000). Потом запусти несколько клиентов и посмотри, в каком порядке обрабатываются их запросы. Если запросы от нескольких клиентов обрабатываются параллельно, значит иди дальше. Если какой-то клиент ожидает окончания обработки запроса другого клиента, значит разбирайся в причинах.
...
Рейтинг: 0 / 0
Проблема с многопоточностью в WCF
    #36308846
Oleg_Oleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А не может быть причина в использовании Application.DoEvents?
Делаю так для обоих вызовов:
.......
while(!MyClient.Ready())
{
Application.DoEvents();
}
......

Как еще можно реализовать проверку возвращаемого методом значения?
...
Рейтинг: 0 / 0
Проблема с многопоточностью в WCF
    #36309535
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_OlegА не может быть причина в использовании Application.DoEvents?
Создайте отдельный поток для данных. И не нужны будут эти костыли.
...
Рейтинг: 0 / 0
Проблема с многопоточностью в WCF
    #36309584
Oleg_Oleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня и так данные на серверной стороне заполняются в потоке. Просто пока они там заполняются, мне нужно проверять доступны ли промежуточные, уже доступные данные. Или я не правильно понял?
...
Рейтинг: 0 / 0
Проблема с многопоточностью в WCF
    #36314453
Oleg_Oleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выяснил, что проблема именно в Application.DoEvents. Так как сделал проверку флага в отдельном таймере и все отработало правильно. Подскажите кто знает, как еще можно организовать циклическую проверку при использовании WCF
...
Рейтинг: 0 / 0
Проблема с многопоточностью в WCF
    #36315159
Varcom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_OlegВыяснил, что проблема именно в Application.DoEvents. Так как сделал проверку флага в отдельном таймере и все отработало правильно. Подскажите кто знает, как еще можно организовать циклическую проверку при использовании WCFИспользуй асинхронные вызовы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
{
....
  BeginОсновнойЗапрос(ОсновнойЗапросComplete, null)
  tmrВторичныеЗапросы.IsEnabled = true;
}

// Эта процедура вызывается в другом потоке
private void ОсновнойЗапросComplete(IAsyncResult result)
{
  tmrВторичныеЗапросы.IsEnabled = false;
  EndОсновнойЗапрос(result);
}

tmrВторичныеЗапросыTick(...)
{
  ДополнительныйЗапрос();
}
...
Рейтинг: 0 / 0
Проблема с многопоточностью в WCF
    #36317735
Oleg_Oleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все получилось! Varcom спасибо за помощь

Модератор: Тема перенесена из форума "C#.NET".
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Проблема с многопоточностью в WCF
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]