|
WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
|
|||
---|---|---|---|
#18+
Почитал это https://msdn.microsoft.com/en-us/library/ms731193.aspx и не понял, как мне сделать, чтобы, с одного клиента метод, скажем, AddData можно было вызвать только синхронно, а два разных метода этого же сервиса (скажем, AddData и GetData) - можно асинхронно? Т. е. вызвал AddData и нельзя его снова вызвать, пока первый вызов не отработал. Даже в параллельном потоке клиента. А вот другой метод сервиса - GetData - чтобы можно было вызвать, даже если на сервисе пока не окончил работу метод AddData. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2015, 10:41 |
|
WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
|
|||
---|---|---|---|
#18+
Мне тут подсказывают на SO, что раздельного поведения для двух разных методов одной службы добиться... трудно, чтоли. Если вообще возможно. Предлагают сделать два сервиса - один принимает данные, другой - отдаёт. Непонятно только, как сделать доступ из двух работающих служб к одним данным. При этом штука в том, что службы работает в режиме "один инстанс на сессию" - т. е. надо как-то создать по экземпляру каждой службы, расшарить между ними сессионные данные (чтобы они считали, что это один и тот же пользователь залогинился). А потом ещё где-то хранить данные, которые нужно отдавать второй службой (но которые должна наполнять первая служба) - где-то в третьем потоке? Блин, не слишком ли сложно для простой задачи "отдаю и читаю данные асинхронно"? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2015, 11:30 |
|
WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
|
|||
---|---|---|---|
#18+
Вот я создал тестовые приложения сервис Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
клиент Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
Результат вывода клиента: ждёт 2 секунды выводит 1 ждёт 2 секунды выводит 11 ждёт 2 секунды выводит 111 затем примерно каждые полсекунды выводит всё остальное - т. е. 1111, 2, 22 и т. д. Как я это объясняю: сервис отработал синхронно, несмотря на то, что у него стояла настройка ConcurrencyMode.Multiple и клиент тоже работал многопоточно. Т. е. сначала клиент в первом потоке вызвал метод AddData сервиса и сервис добавлял четыре элемента по полсекунды - это и есть первая задержка в 2 секунды в выводе клиента. Затем второй поток клиента достучался до сервиса и выдал первый элемент из очереди. Затем первый поток снова добавлял данные 2 секунды в сервис, потом снова второй поток клиента достал очередное данное из очереди. И так, пока первый поток не добавил все данные в сервис, второй постоянно ждал его. Ну а потом работу продолжил один второй поток на клиенте. Так почему же не получилось поработать на сервисе многопоточно? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2015, 11:42 |
|
WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
|
|||
---|---|---|---|
#18+
Короче говоря, как я понял, нужно заставить работать службу в фулл дуплексе , а по умолчанию она работает в полудуплексе, сколько ей ConcurrencyMode.Multiple не выставляй. Т. е. мне-то надо в моём примере, чтобы забор данных был не медленнее, чем они добавляются - т. е. как только добавил новое данное с помощью AddData в одном потоке, второй поток клиента должен его забрать с помощью GetData. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2015, 11:47 |
|
WCF - Как, чтобы один и тот же метод можно вызвать синхронно, а два разных - асинхронно?
|
|||
---|---|---|---|
#18+
Alexey2112, Можете попробовать создать "синхронность" самостоятельно. Пусть все методы будут асинхронными, а в нужном организуйте доступ через критическую секцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2015, 18:33 |
|
|
start [/forum/topic.php?fid=19&msg=39012072&tid=1396862]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 129ms |
0 / 0 |