0 votes

Service WCF avec comportement ConcurrencyMode.Multiple et InstanceContextMode.Single et sécurité du multithreading

J'ai un service configuré avec les attributs suivants

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

Dois-je utiliser dans ce scénario un mécanisme de verrouillage pour les méthodes mises en œuvre dans le service ?

Si oui, est-ce la bonne mise en œuvre ?

[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();
    }
  }
 }
}

3voto

Sergey Teplyakov Points 6556

Vous devez synchroniser l'accès à toutes les ressources partagées (c'est-à-dire à tous les champs ou propriétés du service).

Mais dans ce cas :

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

Non, il n'y a pas besoin de verrouiller, car il n'y a pas de ressource partagée. Pour chaque appel (ou message), il y a une pile d'appels séparée, donc dans ce cas, pour chaque appel, une instance séparée d'Object2 serait créée.

1voto

Tanner Points 6058

Oui, je pense que vous êtes sur la bonne voie ici et votre mise en œuvre semble correcte. Si vous utilisez ConcurrencyMode.Multiple, vous devrez rendre votre code sûr pour les threads, car plusieurs threads vont frapper le service.

Voir ceci Article (le résumé contient un exemple de code) pour plus de détails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X