Я создал простую службу WCF (.NET 3.5), которая определяет 10 контрактов, которые в основном вычисляются по предоставленным данным. На данный момент я ожидаю, что совсем немногие клиенты обратятся к некоторым из этих контрактов. Как сделать службу более отзывчивой? У меня такое ощущение, что служба будет ждать, пока он обрабатывает один запрос, чтобы перейти к следующему. Как использовать многопоточность в WCF для ускорения работы?WCF Service and Threading
ответ
Хотя я согласен с Justin's answer, я считаю, более какой-то свет можно пролить здесь о том, как работает WCF.
Вы делаете конкретное заявление:
У меня есть ощущение, что услуга будет ждать, пока он обрабатывает один запрос на перейти к следующему. Как использовать многопоточность в WCF для ускорения работы ?
Параллельность службы (количество звонков, которое она может принимать одновременно) зависит от ConcurrencyMode
value for the ServiceBehavior
, подключенного к сервису. По умолчанию это значение равно ConcurrencyMode.Single
, то есть он будет сериализовывать вызовы один за другим.
Однако это может быть не так много, как вы думаете. Если ваш InstanceContextMode
вашего сервиса равен InstanceContextMode.PerCall
, то это не проблема; новый экземпляр вашего сервиса будет создан для каждого звонка и не будет использоваться для других вызовов.
Если у вас есть однотонный или объект службы на основе сеанса, то вызовы этого экземпляра реализации службы будут сериализованы.
Вы всегда можете изменить ConcurrencyMode
, но имейте в виду, что если вы это сделаете, вам придется вручную обрабатывать проблемы параллельного доступа и получать доступ к своим ресурсам, так как вы явно сказали WCF, что вы это сделаете.
Важно не изменять их только потому, что вы считаете, что это приведет к повышению производительности. В то время как не столько для параллелизма, но и для каждого аспекта вашего обслуживания очень важна идентификация службы (если она сеансовая или не основанная на сеансах), а изменение их влияет на клиентов, потребляющих услугу, поэтому не делайте это легко.
Конечно, это ничего не говорит о том, действительно ли код , реализующий, является эффективным. Это определенно то, что нужно изучать, когда вы укажете, что это так.
Это определенно предварительная оптимизация. Сначала выполните свои услуги и посмотрите, есть ли проблема или нет.
Я думаю, вы обнаружите, что ничего не беспокоитесь. Сервер не будет блокировать один запрос, поскольку этот запрос обрабатывает. IIS/WCF должен хорошо обрабатывать вещи для вас как есть.
Я не знаком с WCF, но может ли процесс быть асинхронным? Если вы ожидаете огромного объема данных и интенсивных вычислений, одним из вариантов может быть отправка id
, вычисление значений в отдельном потоке, а затем предоставление метода для возврата результата с использованием начального id
.
Что-то вроде:
int id = Service.CalculateX(...);
...
var y = Service.GetResultX(id);
- 1. Try/Catch and threading
- 2. Android and Threading
- 3. C# Threading and synchronization
- 4. Threading and sleep()
- 5. Threading and Background Worker
- 6. Multi Threading and Swing
- 7. Python threading and semaphore
- 8. Django Threading and Tests
- 9. python threading and progressbars
- 10. Threading and Networking
- 11. Threading and Singletons
- 12. Python Threading and Queue
- 13. asp.net threading and gui
- 14. C# Threading and Queues
- 15. Threading and pyfsevents
- 16. Threading and Mutex
- 17. Azure WCF Service Consuse Azure WCF Service
- 18. Threading как служба WCF
- 19. threading in C# windows service
- 20. Getters and Setters, threading and Java
- 21. Threading and synchronization in Java
- 22. VB.Net Threading suspending and resuming
- 23. Python 3 threading and queueing
- 24. Multi Threading and Task issue
- 25. Threading and Recursion in C#
- 26. PySide threading and http download
- 27. Python scoping and threading question
- 28. RabbitMQ Integration Test and Threading
- 29. python lock and threading concurrency
- 30. Threading and Queuing with Functions
Я понимаю вас хорошо, когда говорю, что вы испытываете медленные ответы? Сколько звонков делает клиент, давая минуту. А что медленно? –