WCF ConcurrencyMode Single и InstanceContextMode PerCall - PullRequest
20 голосов
/ 19 августа 2011

У меня проблема с моей конфигурацией службы wcf.Я хотел бы, чтобы каждый звонок в мой сервис создавал новый экземпляр сервиса.Для параллелизма я хотел бы, чтобы один вызов был завершен перед другим запуском.

Таким образом, если у меня есть такая услуга:, след дают:

thread 1
thread 2
start operation
start operation
end operation
end operation

Хотя я хотел бы получить это:

thread 1 start operation end operation
thread 2 start operation end operation

Возможно ли это?Спасибо

Ответы [ 2 ]

20 голосов
/ 22 августа 2011

Я знаю, что этот вопрос был помечен как ответ, но есть лучшая альтернатива :

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

Вместо этого сохраните InstanceContextMode.PerCall для «каждый вызов моей службы создает новый экземпляр», а затем используйте регулирование: Установите для max одновременных экземпляров значение 1 . Документация MSDN делает именно это в качестве одного из примеров.

5 голосов
/ 19 августа 2011

То, что у вас есть, приведет к тому, что новый экземпляр службы будет ускоряться с каждым запросом (это то, что делает PerCall).

Это должно сделать это:

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single, InstanceContextMode=InstanceContextMode.Single)]

FYI, еслисделав это, вы потеряете всю масштабируемость.У вас будет один экземпляр однопоточного сервиса для ответа на все запросы.

...