2010-10-19 3 views
6

Я создал простую службу WCF (.NET 3.5), которая определяет 10 контрактов, которые в основном вычисляются по предоставленным данным. На данный момент я ожидаю, что совсем немногие клиенты обратятся к некоторым из этих контрактов. Как сделать службу более отзывчивой? У меня такое ощущение, что служба будет ждать, пока он обрабатывает один запрос, чтобы перейти к следующему. Как использовать многопоточность в WCF для ускорения работы?WCF Service and Threading

+0

Я понимаю вас хорошо, когда говорю, что вы испытываете медленные ответы? Сколько звонков делает клиент, давая минуту. А что медленно? –

ответ

18

Хотя я согласен с Justin's answer, я считаю, более какой-то свет можно пролить здесь о том, как работает WCF.

Вы делаете конкретное заявление:

У меня есть ощущение, что услуга будет ждать, пока он обрабатывает один запрос на перейти к следующему. Как использовать многопоточность в WCF для ускорения работы ?

Параллельность службы (количество звонков, которое она может принимать одновременно) зависит от ConcurrencyMode value for the ServiceBehavior, подключенного к сервису. По умолчанию это значение равно ConcurrencyMode.Single, то есть он будет сериализовывать вызовы один за другим.

Однако это может быть не так много, как вы думаете. Если ваш InstanceContextMode вашего сервиса равен InstanceContextMode.PerCall, то это не проблема; новый экземпляр вашего сервиса будет создан для каждого звонка и не будет использоваться для других вызовов.

Если у вас есть однотонный или объект службы на основе сеанса, то вызовы этого экземпляра реализации службы будут сериализованы.

Вы всегда можете изменить ConcurrencyMode, но имейте в виду, что если вы это сделаете, вам придется вручную обрабатывать проблемы параллельного доступа и получать доступ к своим ресурсам, так как вы явно сказали WCF, что вы это сделаете.

Важно не изменять их только потому, что вы считаете, что это приведет к повышению производительности. В то время как не столько для параллелизма, но и для каждого аспекта вашего обслуживания очень важна идентификация службы (если она сеансовая или не основанная на сеансах), а изменение их влияет на клиентов, потребляющих услугу, поэтому не делайте это легко.

Конечно, это ничего не говорит о том, действительно ли код , реализующий, является эффективным. Это определенно то, что нужно изучать, когда вы укажете, что это так.

3

Это определенно предварительная оптимизация. Сначала выполните свои услуги и посмотрите, есть ли проблема или нет.

Я думаю, вы обнаружите, что ничего не беспокоитесь. Сервер не будет блокировать один запрос, поскольку этот запрос обрабатывает. IIS/WCF должен хорошо обрабатывать вещи для вас как есть.

1

Я не знаком с WCF, но может ли процесс быть асинхронным? Если вы ожидаете огромного объема данных и интенсивных вычислений, одним из вариантов может быть отправка id, вычисление значений в отдельном потоке, а затем предоставление метода для возврата результата с использованием начального id.

Что-то вроде:

int id = Service.CalculateX(...); 
... 
var y = Service.GetResultX(id);