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

Windows Forms Discussion :

[threads]Rafraichissement des données dans une application C#/winform/SGBD


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 24
    Points : 19
    Points
    19
    Par défaut [threads]Rafraichissement des données dans une application C#/winform/SGBD
    Bonjour à tous,

    Suite à de longues recherches infructueuses et avant de m'avouer définitivement vaincu, j'aimerais avoir l'avis de la communauté :

    Le cahier des charges :
    Un poste client contenant un dataset qui correspond au chargement d'une table du sgbd distant, mais cette table ayant été modifiée entre temps par un autre client de l'application, la version du dataset en mémoire sur le poste client n'est plus à jour.

    Dans la mesure ou une connexion au sgbd peut etre lente, l'objectif est de récupérer les données (requete sql sur le sgbd) via un thread distinct du thread du formulaire du poste client pour ne pas bloquer l'interface client inutilement.

    Je sais qu'il existe des threads background worker fait spécifiquement pour ca, mais mon objectif est d'essayer d'utiliser des fonctionnalités de plus bas niveau en termes de threading et d'isolation des données pour des raisons de portabilités vers d'autres langages et d'évolutivité en général. Et aussi pour savoir le faire .

    Le problème est assez simple, j'en ai conscience mais je n'ai pas réussi. Est ce que certains d'entres vous pourraient me donner leur avis et me conseiller une méthode simple et élégante pour récupérer les données sans risque d'accès concurrents sur le dataset entre le thread ui et le thread récupérant les données d'une part, puis pour la mise à jour du thread ui d'autre part, une fois les données récupérées.

    Par ailleurs si certains d'entres vous sont formés sur ce point quelles sont les pratiques recommandées pour ce type de mise à jour.

    Merci beaucoup à vous,
    Vincent.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Bonjour à tous,

    Je sais bien que ce n'est pas si simple mais si quelqu'un avait une piste de bonne qualité ou le nom d'un bon livre qui traite de ce point, il me rendrait un fier service.

    Bon week-end à tous,
    Vincent

  3. #3
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Tu as des contraintes particulières ; tout le monde ne s'amuse pas à traverser le pays en mobylette quand on aune Ferrari dans le garage (dit-il en exagérant un poil ) Et de nombreux autres langages ont aussi des constructions de haut niveau qui évitent de faire trop de plomberie dans la gestion des threads.

    Ceci dit, Backgroundworker ou pas : ça dépend. Si ton dataset est bindé (à une datagridview, à tout hasard), tu ne peux pas simplement le MAJ depuis le thread métier, puisque le binding dataset - datagridview se fait par des events levés à chaque modif.
    Ce que tu peux faire, c'est simplement suspendre le binding avant la MAJ, et le remettre une fois que c'est fini. Sinon, plutôt que MAJ le dataset bindé à l'UI lui-même, tu peux faie en sorte que le thread métier renvoie un nouveau dataset; une fois le thread métier terminé, le thread d'UI prend ce dataset, suspend le binding, MAJ l'ancien dataset avec le nouveau, et remettre le binding.
    ಠ_ಠ

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Un poste client contenant un dataset qui correspond au chargement d'une table du sgbd distant, mais cette table ayant été modifiée entre temps par un autre client de l'application, la version du dataset en mémoire sur le poste client n'est plus à jour.
    Quelle est la contrainte véritable sachant qu'il sera impossible que la table soit systèmatiquement à jour ?
    Il restera toujours des cas ou il y aura une différence et des conflits d'accès concurrrentiel.

    Veux-tu simplement une table à peu près à jour ?

    Dans ce cas, pour répondre à l'objectif consistant à actualiser le dataset dès qu'une modif est détectée sur le SGBD, on peut insérer un champ d'horodatage automatique en cas de modification/création et interroger périodiquement la table par une requête portant sur ce champ afin d'exraire les derniers ajouts/créations (solution alternaticve pour SQL server : SQLDependency). Toutefois, cette approche consomme des ressources CPU, réseau et SGBD et ne règle pas le problème des suppressions ...
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Bonjour à tous et plus particulièrement à Guulh et Graffito,

    Je viens d'aller voir ce thread en arrivant au bureau ce matin, non que j'attendais avoir eu une réponse mais juste comme ca pour passer le temps. Et là j'ai vu que j'avais vos deux réponses.

    Je n'avais pas utilisé ce compte depuis longtemps et l'adresse mail associée n'était plus bonne. Je n'avais pas reçu de notification de vos messages, et j'ignorais que vous vous étiez donné le mal de répondre.

    Avec toutes mes excuses, et merci pour vos réponses
    Vincent

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/06/2010, 12h11
  2. Liaison des données dans une application multi-couche
    Par Epitt dans le forum Accès aux données
    Réponses: 12
    Dernier message: 09/10/2009, 13h15
  3. Réponses: 9
    Dernier message: 21/02/2006, 09h06
  4. Réponses: 2
    Dernier message: 15/06/2005, 17h32
  5. question sur le rafraichissement des données dans la base
    Par vbcasimir dans le forum Bases de données
    Réponses: 8
    Dernier message: 06/06/2005, 12h44

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