WCF ConcurrencyMode Single и InstanceContextMode PerCall
У меня проблема с моей конфигурацией службы wcf. Я хотел бы, чтобы каждый звонок в мой сервис создавал новый экземпляр сервиса. Для параллелизма я хотел бы, чтобы один вызов завершился до начала другого.
Таким образом, если у меня есть такой сервис:
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single,
InstanceContextMode=InstanceContextMode.PerCall)]
public class MyService: IMyService
{
public bool MyServiceOp()
{
Debug.WriteLine("thread "+
Thread.CurrentThread.ManagedThreadId.ToString());
Debug.WriteLine("start operation ");
Do_work()
Debug.WriteLine("end operation");
return true;
}
}
Когда я вызываю это с многократным вызовом в цикле, след дает:
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 ответа
Я знаю, что этот вопрос был помечен как ответ, но есть лучшая альтернатива:
Если вы используете InstanceContextMode.Single, то вы будете использовать один и тот же экземпляр для всех вызовов. Если ваша служба работает долго, это требует, чтобы ваш код прекрасно управлял ресурсами, так как он никогда не будет собирать мусор без перезапуска службы.
Вместо этого сохраните InstanceContextMode.PerCall для "каждый вызов моей службы создает новый экземпляр", а затем используйте регулирование: установите максимальное число одновременных экземпляров равным 1. Документация MSDN делает именно это как один из примеров.
То, что у вас есть, приведет к появлению нового экземпляра службы с каждым запросом (это то, что делает PerCall).
Это должно сделать это:
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single, InstanceContextMode=InstanceContextMode.Single)]
К вашему сведению, если вы сделаете это, вы потеряете всю масштабируемость. У вас будет один экземпляр однопоточного сервиса для ответа на все запросы.