Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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