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

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

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

дает многопоточность сервера при запросе от клиентов, одну инстанцию сервера для клиента пока он подключен, и отсуствие блокировки - лочить надо самостоятельно, если необходимо.
...
Рейтинг: 0 / 0
12.11.2009, 18:36
    #36307561
Varcom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с многопоточностью в WCF
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
13.11.2009, 10:29
    #36308451
Oleg_Oleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с многопоточностью в WCF
Спасибо за советы.
Попробовал UseSynchronizationContext=false, ConcurrencyMode = ConcurrencyMode.Multiple
не помогло, первый клиент по-прежнему ждет пока второй не закончит свою работу, хотя по логам видно что первый клиент заканчивает работу раньше
...
Рейтинг: 0 / 0
13.11.2009, 11:42
    #36308739
Varcom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с многопоточностью в WCF
Oleg_OlegСпасибо за советы.
Попробовал UseSynchronizationContext=false, ConcurrencyMode = ConcurrencyMode.Multiple
не помогло, первый клиент по-прежнему ждет пока второй не закончит свою работу, хотя по логам видно что первый клиент заканчивает работу раньше
Сделай тестовую версию сервера. Метод обработки первичного запроса клиента замени на длинный Sleep(60*1000), вторичные запросы обрабатывай через Sleep(10*1000). Потом запусти несколько клиентов и посмотри, в каком порядке обрабатываются их запросы. Если запросы от нескольких клиентов обрабатываются параллельно, значит иди дальше. Если какой-то клиент ожидает окончания обработки запроса другого клиента, значит разбирайся в причинах.
...
Рейтинг: 0 / 0
13.11.2009, 12:10
    #36308846
Oleg_Oleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с многопоточностью в WCF
А не может быть причина в использовании Application.DoEvents?
Делаю так для обоих вызовов:
.......
while(!MyClient.Ready())
{
Application.DoEvents();
}
......

Как еще можно реализовать проверку возвращаемого методом значения?
...
Рейтинг: 0 / 0
13.11.2009, 15:27
    #36309535
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с многопоточностью в WCF
Oleg_OlegА не может быть причина в использовании Application.DoEvents?
Создайте отдельный поток для данных. И не нужны будут эти костыли.
...
Рейтинг: 0 / 0
13.11.2009, 15:40
    #36309584
Oleg_Oleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с многопоточностью в WCF
У меня и так данные на серверной стороне заполняются в потоке. Просто пока они там заполняются, мне нужно проверять доступны ли промежуточные, уже доступные данные. Или я не правильно понял?
...
Рейтинг: 0 / 0
17.11.2009, 12:06
    #36314453
Oleg_Oleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с многопоточностью в WCF
Выяснил, что проблема именно в Application.DoEvents. Так как сделал проверку флага в отдельном таймере и все отработало правильно. Подскажите кто знает, как еще можно организовать циклическую проверку при использовании WCF
...
Рейтинг: 0 / 0
17.11.2009, 15:53
    #36315159
Varcom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с многопоточностью в WCF
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
18.11.2009, 16:14
    #36317735
Oleg_Oleg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с многопоточностью в WCF
Все получилось! Varcom спасибо за помощь

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


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