IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

[C# MultiThreading]"Fuites" de Handle ou de Thread


Sujet :

Framework .NET

  1. #1
    Membre à l'essai

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4
    Points : 11
    Points
    11
    Par défaut [C# MultiThreading]"Fuites" de Handle ou de Thread
    Bonjour à tous.

    Je développe une application C# utilisant des objets COM/DCOM.
    Les wrappers fonctionnent bien.
    Malheureusement, si le serveur COM/DCOM est planté ou injoignable (cable débranché...), il arrive que les fonctions wrappées soient bloquées, et donc que ca bloque mon application.

    Pour ne pas bloquer mon application, j'ai voulu exécuter ces fonctions dans des threads différents de mon application, en utilisant plusieurs méthodes possibles :

    - Les threadpools
    - des appels asynchrones en utilisant des delegate et du BeginInvoke
    - Création de thread, abort, et join.

    L'utilisation du threadpool ou des appels asynchrones ne sont pas concluants car je ne peux pas implementer de timeout (impossibilité de faire un join !!), et la j'aurais une fuite de thread

    L'utilisation de thread aurait pu bien fonctionner, cependant je tombe sur un problème de handle non libéré par le GC (confirmé par google ), et au bout d'un long moment mon application est bloqué sur la methode start d'un thread, car à priori il n'y a plus de handle disponibles (les longs ponts de mai apportent leurs lots de bugs ).

    Idealement, je voudrais pouvoir faire un join sur un BeginInvoke, mais ca semble pas être possible :'(

    Vous auriez une idée ?

    Merci

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par djseb Voir le message
    B
    L'utilisation de thread aurait pu bien fonctionner, cependant je tombe sur un problème de handle non libéré par le GC (confirmé par google ), et au bout d'un long moment mon application est bloqué sur la methode start d'un thread, car à priori il n'y a plus de handle disponibles (les longs ponts de mai apportent leurs lots de bugs ).
    La méthode avec les thread est la seule utilisable dans votre cas. Pour le problème de fuite de Handle il ne faut pas oublier :
    - D'appeler Dispose pour libérer la mémoire des objets COM.
    - De détruire les threads créé en étant sur qu'il n'existe plus aucune référence à aucun objet créé dans le thread.

    il n'y a pas de raison ( en tout cas que je connaisse ) pour qu'un thread ne soit pas libéré simplement à cause de l'utilisation de COM

  3. #3
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 77
    Points : 78
    Points
    78
    Par défaut
    Je pense qu'utiliser le composant System.ComponentModel.BackgroundWorker pourrait résoudre ton souci

    Tu as la méthode CancelAsync () qui te permet d'arreter le traitement asynchrone.

    Bon courage

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo