none
.NET remoting et MultiThreading RRS feed

  • Question

  • Bonjour chers experts,

     

    Je développe actuellement une application composée d'un service Windows et d'une feuille de gestion du service.

     

    Le principe de fonctionnement est le suivant (Assez banal, je l'avoue :-).

    1. Au lancement du service, celui-ci ouvre un canal IPC et met à disposition l'objet principal du service pour la fenêtre de gestion : Utilisation d'un objet héritant de la classe MarshalByRefObject
    2. La feuille de gestion se connecte elle au canal IPC ouvert par le service et récupère l'objet par l'intermédiaire des méthodes Activator.GetObject

    Ce fonctionnement marchait très bien lorsque le service était mono-thread. L'affichage des informations du service se déroulait sans problème dans la fenêtre de gestion, dans tous les cas.

     

    Mon service effectue des analyses statistiques  assez poussés et donc afin d'améliorer les performances de celui-ci, nous sommes passés à une version multithread du service (gain de l'ordre de 25% à 50% en temps d'execution). Pour ce faire, nous utilisons le ThreadPool de .NET.

     

    Or depuis, le passage en multi-thread, j'ai un blocage de l'application cliente (L'application ne répond pas) lorsque je veux accéder aux propriétés de mon objet service : Aucun timeout n'est détecté et je suis sur que le service fonctionne puisque je peux suivre son évolution dans les fichiers de logs.

    De plus, ce blocage ne se présente que lorsque des analyses statistiques sont en cours alors que si le service ne fait rien (En attente de prochain traitement), la fenêtre de gestion peut afficher les informations.

     

    J'ai déjà essayé les solutions suivantes mais le problème persiste :

    1. Diminution au plus bas de la priorité des threads => Aucun impact
    2. Diminution du nombre de thread au minimum possible => Aucun impact

    et donc, je séche complètement, je suis à court d'idée.

    Auriez vous une idée de la nature du problème et de comment le corriger ?

     

    Merci d'avances et si vous avez des questions, n'hésitez pas

    mercredi 12 novembre 2008 12:54

Réponses

  • Après de multiple recherche, j'ai enfin trouvé d'où venait le problème :

     

    Du coté du service, les demandes d'accès à l'objet distant sont gérés grâce au ThreadPool de .NET.

    Donc si le service utilise le maximum de threads disponibles du ThreadPool, la requête d'accès à l'objet distant de la part du client est mise en attente dans le ThreadPool (Accès synchrone). Lorsqu'un thread est disponible dans le pool, la demande sur l'objet distant est traité...

     

    Du coté du client (La fenêtre de gestion du service), les appels à un objet distant se font de manière synchrone. Lorsque vous accèdez à une propriété de l'objet distant, l'application reste en attente de la valeur de la propriété : D'où le message l'application ne réponds pas ...

     

    Or dans mon cas, le threadpool pouvait contenir jusqu'à 500 threads (Même si le nombre de thread simultanée est de 5), et la demande d'accès à l'objet distant se trouvait dons en fin de pool. Chaque traitement peut prendre plusieurs minutes pour être terminé.

     

    Pour corriger, ce problème j'ai du donc passer par une gestion manuelle de mes threads d'analyses et non par le threadpool.

     

    AND IT'S WORKING GREAT ......

     

    En espérant que cela puisse servir,

    Si vous avez des questions ou besoins d'éclaircissements.

    N'hésitez pas...

     

     

    lundi 17 novembre 2008 09:23