|  | 
| 
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=39011959&tid=1396862]: | 0ms | 
| get settings: | 9ms | 
| get forum list: | 14ms | 
| check forum access: | 3ms | 
| check topic access: | 3ms | 
| track hit: | 42ms | 
| get topic data: | 11ms | 
| get forum data: | 2ms | 
| get page messages: | 47ms | 
| get tp. blocked users: | 1ms | 
| others: | 231ms | 
| total: | 363ms | 

| 0 / 0 | 
