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

C# Discussion :

ThreadPool comment ça marche


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut ThreadPool comment ça marche
    Bonjour,

    Je souhaite faire un mécanisme basé sur les ThreadPool pour parcourir une arborescence de dossier.

    Je crée donc un thread par dossier qui s'occupe récursivement de descendre dans l'arborescence. Ça semble bien fonctionner.

    Par contre, j'ai une méthode (addAccess) à l'intérieure de ma méthode de parse (importFolder) qui écrit et supprime des données dans une BDD... Et j'ai des erreurs de violation de clé primaire. Or dans ma méthode addAccess, je fais bien un delete via une méthode (removeAccess) avant l'insert, mais j'ai le sentiment que vu que je suis dans un thread il n'attend pas la fin de ma méthode removeAccess !!

    Est ce que vous pouvez m'éclairer sur ce problème ? Y a t-il un problème de Lock quelque part ?

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour.

    Il est difficile de répondre sans voir le code de manipulation de la DB mais en général le problème vient de ce que tous les threads utilisent de façon concurrente un mécanisme côté client qui n'est pas adapté à ce scénario (non-"thread safe"). Par exemple une DataTable : bien que la DB elle-même puisse supporter des opérations concurrentes, le type DataTable maintient des caches locaux qui, eux, ne supportent pas ce scénario. La solution dans ce cas est de protéger les accès à Datatable pour garantir une exclusion mutuelle, par exemple via un "lock" ou un ReaderWriterLockSlim.

    Mais le problème pourrait être plus fondamental, avec des opérations concurrentes qui interfèrent entre elles au niveau de la DB elle-même. Par exemple un thread a vérifié que tel ID n'était pas présent dans la table mais depuis cette vérification un autre thread l'a rajouté. On se tournera dans ce cas vers les transactions ou les verrous pour assurer une exclusion mutuelle des traitements (un seul à la fois).

    Enfin cela pourrait aussi venir de transactions qui ont échoué et ont été annulées par la DB. Si le programme ommet de vérifier que les transactions ont bien été complétées alors il peut se retrouver avec une base de données contenant encore les lignes qu'il pensait avoir supprimé.

  3. #3
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    OK. pour info j'ai ajouté un lock autour de ma méthode addAccess.
    Et je n'ai plus de problème ...

    Je dois avouer que je ne comprends pas trop bien à quoi sert ce Lock ? C'est un peu flou ...

  4. #4
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Il empêche que deux threads exécutent simultanément cette méthode : si A cherche à exécuter cette méthode alors que B est déjà dedans, alors A il sera mis en attente en attendant que B en sorte. Si tu veux une explication de ton problème il faut nous montrer le code de cette méthode.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ToAsciiEx, comment cela marche ?
    Par mikyfpc dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/02/2004, 21h39
  2. [MFC] list box : comment ça marche
    Par runn2 dans le forum MFC
    Réponses: 4
    Dernier message: 28/01/2004, 12h36
  3. [SYNEDIT] -> Comment ça marche ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 19h11
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

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