При использовании .NET Remoting с использованием объектов, активируемых сервером, каковы компромиссы между активацией SingleCall и Singleton? - PullRequest
1 голос
/ 20 января 2009

Я пытаюсь различить разницу между методами активации SingleCall и Singleton при реализации сервера для размещения объекта с помощью .NET Remoting. Казалось бы, у SingleCall есть издержки на создание и очистку объекта для каждого вызова на стороне клиента, тогда как у Singleton есть ограничение - возможность обслуживать ограниченное количество одновременных запросов. Я стараюсь сделать выступление как можно лучше. Какой мне выбрать?

Ответы [ 2 ]

3 голосов
/ 20 января 2009

Вы правы. SingleCall создает объект для каждого вызова и может принимать несколько одновременных запросов, но данные не могут быть разделены между вызовами, в то время как Singleton создает один объект для обработки нескольких вызовов, позволяя обмениваться данными, но ограничивает одновременные соединения. Однако есть некоторые хитрости, которые вы можете сделать, если у вас есть представление о том, как создавать поточно-ориентированные объекты.

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

Во-вторых, я хотел бы изучить добавление ConcurrencyMode = ConcurrencyMode.Multiple к поведению ServiceBehaviors вашего сервиса. Это позволяет нескольким пользователям одновременно поразить ваш синглтон.

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)] 
public class CalculatorService : ICalculatorConcurrency 
{ 
    …
}

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

Много полезной информации по этим темам можно найти здесь:

http://msdn.microsoft.com/en-us/library/ms731193.aspx

2 голосов
/ 20 января 2009

По умолчанию вы должны использовать SingleCall.

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

Я нашел этот сайт хорошим ресурсом, когда дело касается удаленного взаимодействия .NET: http://www.thinktecture.com/resourcearchive/net-remoting-faq/remotingusecases

...