Сервис WCF полностью заблокирован - PullRequest
1 голос
/ 01 апреля 2011

У меня есть служба WCF, настроенная следующим образом:

InstanceContextMode = InstanceContextMode.PerCall,
ConcurrencyMode = ConcurrencyMode.Multiple

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

На стороне сервера у меня есть статический объект "MyStaticObject" (не объявлен в моей службе, этодругой класс на сервере).Этот объект представляет собой словарь, который содержит несколько экземпляров объектов, в которых есть фоновый работник.

Я не думаю, что в базе данных есть тупик, поскольку он блокируется при попытке доступа к службе, а не при попыткедля доступа к базе данных.

В настоящее время я блокирую свой словарь следующим образом:

lock (MyClass.MyStaticLockObject)
{
    MyClass.MyStaticObject...;
}

Я хотел бы знать, что может вызвать такое странное поведение.

1 Ответ

2 голосов
/ 01 апреля 2011

Я видел блокировку служб WCF при высоких нагрузках, если вы создаете новый прокси-объект на стороне клиента для каждой операции. Вы уверены, что не создаете 10 экземпляров прокси в секунду?

Если вы обращаетесь к статическому экземпляру словаря, вы можете захотеть заблокировать его, когда выполняете операции чтения / записи, например:

lock (MyStaticObject)
     MyStaticObject.Add("Foo", foo);

lock (MyStaticObject)
     foo = MyStaticObject["Foo"];

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

Кстати: для тех невероятных, что сервис будет вызываться 10 раз в секунду, я в настоящее время работаю над проектом, в котором он довольно неплохо работает при 100 вызовах в секунду - и мне придется там, где он будет развернут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...