Служба WCF с ConcurrencyMode.Multiple и InstanceContextMode.Single поведения и безопасности многопоточности - PullRequest
0 голосов
/ 04 февраля 2010

У меня настроен сервис со следующими атрибутами

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class UserService : IUserServiceContract
{}

Должен ли я использовать в этом сценарии механизм блокировки для методов, реализованных в службе?

Если да, это правильная реализация?

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public class UserService : IUserServiceContract
{
private readonly object LockObject = new object();

public Object1 GetObject1()
{
    lock (LockObject)
    {
        using (var ob = new Object1)
        {
            return ob.Get();
        }
    }
 }

 public Object2 GetObject2()
 {
  lock (LockObject)
  {
    using (var ob = new Object2)
    {
        return ob.Get();
    }
  }
 }
}

Ответы [ 2 ]

5 голосов
/ 04 февраля 2010

Вам следует синхронизировать доступ ко всем общим ресурсам (т. Е. Ко всем полям или свойствам службы).

Но в этом случае:

public Object2 GetObject2()
 {
  lock (LockObject)
  {
    using (var ob = new Object2)
    {
        return ob.Get();
    }
  }
 }

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

1 голос
/ 04 февраля 2010

Да, я думаю, что вы на правильном пути, и ваша реализация выглядит правильно.При использовании ConcurrencyMode.Multiple вам нужно будет обеспечить безопасность своего потока кода, так как несколько потоков попадут на службу.

См. статью (резюме содержит пример кода) , для получения более подробной информации.

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