WCF ConcurrencyMode Single и InstanceContextMode PerCall
У меня проблема с моей конфигурацией службы wcf.
Я хотел бы, чтобы каждый вызов моей службы создавал новый экземпляр службы.
Для concurrency я хотел бы, чтобы один вызов был закончен перед другим запуском.
Таким образом, если у меня есть такая служба, как эта:
[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
Возможно ли это? Спасибо вам
Ответы
Ответ 1
Я знаю, что этот вопрос был отмечен как ответ, но есть лучшая альтернатива:
Если вы используете экземпляр InstanceContextMode.Single, вы будете повторно использовать один и тот же экземпляр для всех вызовов. Если ваш сервис длительный, это требует, чтобы ваш код прекрасно управлял ресурсами, поскольку он никогда не будет собираться с мусором без перезапуска службы.
Вместо этого сохраните InstanceContextMode.PerCall, чтобы "каждый вызов моей службы создавал новый экземпляр", а затем использовал дросселирование: Установить максимальные параллельные экземпляры до 1. Документация MSDN делает это как один из примеров.
Ответ 2
То, что у вас есть, приведет к появлению нового экземпляра службы, вращающегося с каждым запросом (что делает PerCall).
Это должно сделать это:
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Single, InstanceContextMode=InstanceContextMode.Single)]
FYI, если вы это сделаете, вы потеряете всю масштабируемость. У вас будет один экземпляр однопоточной службы для ответа на все запросы.