See Sharp
Is it really just a matter of point of view ?

The Dread Dead Locks a.k.a. You (almost) can't serve and be served

September 14, 2008 10:50 by salfab

Introduction 

La dernière fois que nous avons abordé le theme des services WCF, nous avons vu comment mettre en place une solution Client / Serveur à l'aide de WCF. Pour ce faire, nous avions utilisé trois projets, le premier définissant le contrat du service, le second le serveur hébergeant ce service, et le dernier, un client pour le consommer.

Aujourd'hui, nous allons aborder une autre architecture. Admettons que nous avons un programme que nous aimerions piloter depuis plusieurs "front-ends". Une version web, une version en WPF, et une version en silverlight.

La première idée est bien sur de reprendre notre architecture de la dernière fois, mais ceci implique d'avoir deux exécutables pour un seul programme. Un pour le serveur, et un pour l'interface utilisateur, le client. Il s'agit là de la configuration idéale pour minimiser le footprint de notre solution.

Une autre approche possible est d'avoir une application avec la couche business ainsi que l'interface utilisateur dans le même exécutable, mais de quand même pouvoir piloter la couche business depuis un autre "front-end". Deux possibilités ici :

  • Appel direct aux méthodes de la couche business pour l'UI par défaut.
    • On ne passe alors plus par le service WCF pour attaquer la couche business.
  • Appel uniformisé pour touts les FrontEnds
    • Afin d'uniformiser la façon dont la couche business est attaquée, et de s'assurer qu'il n'existe aucune différence entre les différents front-ends, l'UI se trouvant dans le même process que l'hôte du service créera également un client WCF.

si la première approche ne pose aucun problème majeur, à part le fait qu'il faudra veiller à traiter les appels de la même façon pour les front-ends internes et externes, la seconde approche, elle, pose son lot de soucis.

Avant de commencer, précisons que cette seconde approche n'est pas forcément celle à adopter, mais elle a le mérite de mettre en évidences certains mécanismes de WCF...

Mise en place

Tout d'abord, faisons deux projets, l'un pour le contrat du service, l'autre pour notre application. tout se passe comme lors de notre dernière renncotre avec WCF, à la différence que cette fois-ci, le code instanciant le service et le client se trouvent dans le même projet.

Les sections Service et Client  devront donc tous deux se trouver dans le même app.conf, celui se trouvant dans le projet de l'application.

Si tout est correctement fait, le serveur va être instancié correctement, le client également, mais au premier appel d'une operation de notre service, le programme va se bloquer, et après une minute, une exception de TimeOut sera lancée.

Explications

WCF utilise un contexte de synchronisation (SynchronizationContext) pour simplifier la vie du développeur face aux problèmes de multithreading. Par défaut, l'utilisation du SynchronizationContext est activée, mais peut être désactivée en utilisant l'attribut [ServiceBehavior(UseSynchronizationContext = false)] sur la classe qui implémente le service en question. L'utilisation du contexte de synchronization aura pour effet de mettre tous les appels à ce service dans une file d'attente. Les appels dans cette file d'attente seront exécutés dans le thread dans lequel le canal du service a été créé, et ce, dès que celui-ci sera libéré.

Ceci présente l'avantage, si le canal du service est créé dans le UIThread, de pouvoir acceder aux contrôles graphiques sans avoir à synchroniser nous-même des threads afin d'éviter une exception "Cross-Thread operation not valid" : Tous les appels au service seront appellés dans le bon thread.

Malheureusement, dans notre cas précis, le client et le service son exécutés dans le même thread, ainsi, lorsque le client fait appel à une opération du service, l'appel est bloquant, attendant la réponse du service. Le service, quant-à-lui attend que le thread sur lequel il est mis en attente se libère. Le client attend donc la réponse du service, et le service attend que le client libère le thread sur lequel il doit s'exécuter, d'où interbloquage.

Résolution 

Pour résoudre ce problème, il suffira de désactiver l'utilisation du contexte de synchronisation avec l'attribut précité, mais par la même, nous perdrons l'avantage qu'il confère, ce qui signifie qu'îl ne nous est pas assuré que les opérations du service seront exécutées sur le "bon" thread.

Ce problème pourra toujours être résolu au cas par cas en assurant manuellement la synchronisation des threads grâce à la méthode Invoke. Il sera alors possible de modifier les éléments de l'interface graphique.


Tags: , ,
Categories:
Actions: E-mail | Permalink | Comments (20) | Comment RSSRSS comment feed

Comments

August 11. 2009 01:44

cash loans

I wish getting over a broken heart can be so easy as following a few steps.. but its not� Frown

cash loans

August 15. 2009 04:56

Invicta Mens Lupah Collection

Very interesting topic will bookmark your site to check if you write more about in the future.

Invicta Mens Lupah Collection

August 17. 2009 02:54

Seiko Snab59p1 Mens Sports

I like how you write.Are you interesting in a part time writer job?

Seiko Snab59p1 Mens Sports

August 19. 2009 00:31

Seiko Mens Watches Sportura

I don't like your template but your posts are quite good so I will check back!

Seiko Mens Watches Sportura

August 27. 2009 13:53

Baume Mercier Classima

I don't like your template but your posts are quite good so I will check back!

Baume Mercier Classima

August 28. 2009 06:00

bad credit loans

I don�t usually reply to posts but I will in this case. WoW Smile

bad credit loans

March 4. 2010 07:09

hd movies

I love streaming movies online, it is way easier than going to the theaters.

hd movies

May 8. 2010 15:30

Mariana

Hey, great blog, but I don’t understand how to add your site in my rss reader. Can you Help me please?

Mariana

May 20. 2010 00:52

Wahdo Tech

Hey, great blog, but I don’t understand how to add your site in my rss reader. Can you Help me please?

Wahdo Tech

May 22. 2010 05:24

loan modification program

Hi.  Is there a reason why this page looks messed up in Opera?  Anyway a bit of advice, do a second writeup soon!

loan modification program

June 9. 2010 23:21

free registry cleaners

found your site on del.icio.us today and really liked it.. i bookmarked it and will be back to check it out some more later

free registry cleaners

June 30. 2010 07:07

mbt men shoes

Hhe article's content rich variety which make us move for our mood after reading this article. surprise, here you will find what you want! Recently, I found some wedsites which commodity is colorful of fashion. Such as that worth you to see. Believe me these websites won’t let you down.
www.mbt-outlet-store.com/mbt-men-shoes.html




mbt men shoes

July 13. 2010 23:07

Amos Lachance

Awesome info here!  I have been searching for this everywhere, and I'm glad I finally came across it!  Keep up the good work.

Amos Lachance

July 24. 2010 09:28

Jordon Pagni

This is a interesting post.

Jordon Pagni

July 25. 2010 14:45

Orval Amis

This post is interesting.

Orval Amis

July 27. 2010 17:01

Hostgator Review

Thanks for this post, It's fantastic to see another BlogEngine.NET user. Most people these days tend to use Wordpress, but in my opinion, BlogEngine.NET is the best system to use.

Hostgator Review

July 29. 2010 03:47

migraine

Migraine is een ernstige vorm van hoofdpijn. Het treedt in aanvallen op en gaat vaak gepaard met visuele stoornissen en misselijkheid.

migraine

August 1. 2010 12:12

lenen

Lenen zonder BKR toetsing gaat vandaag heel gemakkelijk. Binnen een paar uur geld lenen zonder BKR toetsing doet u hier, lees snel verder

lenen

August 11. 2010 08:01

hypotheek

Bereken zelf uw hypotheek. Hypotheek berekenen? Maak snel een indicatieve berekening van het maximale leenbedrag van uw hypotheek.

hypotheek

September 8. 2010 00:21

Mica Mccant

Wow, really great information. This blog is really awesome. I bookmarked this and will return again.

Mica Mccant

Add comment


(Will show your Gravatar icon)

  Country flag

biuquote
  • Comment
  • Preview
Loading