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 Workflow Foundation .NET Discussion :

Controles bindés ne se remettent pas à jour si data mis à jour dans une activité


Sujet :

Windows Workflow Foundation .NET

  1. #1
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut Controles bindés ne se remettent pas à jour si data mis à jour dans une activité
    Bonjour,

    J'ai un SequenceWorkflow dans lequel il y a des CallExternalMethodActivities qui appellent des méthodes dans une librairie, qui mettent à jour des données dans un DataSet, qui sont bindées par un BindingSource à des contrôles winform.

    Lors de l'exécution, les données sont bien mises à jour, mais les contrôles ne sont pas rafraichis.

    Si je lance les mêmes fonctions dans le même ordre sans passer par le workflow, les contrôles sont bien rafraichis.

    J'ai essayé les Applications.DoEvents() ou les Refresh() forcés de Form, ça ne marche pas.

    Je n'ai pas d'autres idées, et ca me bloque complètement. Que faut-il faire ?
    ZTAB (Ze Text Adventure Builder)

    Logiciel très intuitif et ergonomique de création de jeux d'aventure et de livres dont vous êtes le héros.

    http://sites.google.com/site/ztabsoft/

  2. #2
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Points : 443
    Points
    443
    Par défaut
    Bonjour,

    A vu de nez, je pense que cela vient du fait que ton workflow est exécuté dans un thread séparé. Du coup, cela doit bloquer le rafraichissement de ton contrôle.

    Essaie d'utiliser un backgroundworker dans ton activité et d'exécuter ta logique dedans. Normalement, tu devrais retrouver le même comportement que celui sans le workflow.

  3. #3
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    C'est possible que ca soit une histoire comme ca.
    Je ne suis pas très familier de l'usage des backgroundWorkers.

    Dois-je créer un backgroundWorker à chaque appel de fonction ?

    Sinon il existe une autre technique pour synchroniser des threads avec des fenetres winforms, qui est je crois de faire un Invoke de la méthode ou lieu de l'appeler directement, mais je ne sais plus exactement comment ca marche.
    ZTAB (Ze Text Adventure Builder)

    Logiciel très intuitif et ergonomique de création de jeux d'aventure et de livres dont vous êtes le héros.

    http://sites.google.com/site/ztabsoft/

  4. #4
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Bonjour,

    Je n'ai pas choisi de faire avec un backgroundworker, car pour une bonne découpe architecturale en terme de dépendances, je ne veux pas introduire de composants winforms dans ma lib qui gère les accès au dataset.

    Je suis donc parti sur un synchronizationContext, et je gère donc les problématiques de synchronisation d'affichage uniquement dans l'assembly qui sait ce que c'est que les winforms.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
            SynchronizationContext m_synchronizationContext = null;
            public Form1()
            {
                InitializeComponent();
     
                m_synchronizationContext = WindowsFormsSynchronizationContext.Current;
     
                foreach(System.ComponentModel.Component l_component in this.components.Components)
                {
                    if (l_component is BindingSource)
                    {
                        BindingSource l_bindingSource = (BindingSource)l_component;
                        bool l_res = l_bindingSource.IsSynchronized;
                        l_bindingSource.ListChanged += new System.ComponentModel.ListChangedEventHandler(l_bindingSource_ListChanged);
                    }
                }
     
                StartWorkflow();
            }
     
            void l_bindingSource_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
            {
                ((BindingSource)sender).ListChanged -= new System.ComponentModel.ListChangedEventHandler(l_bindingSource_ListChanged);
                            m_synchronizationContext.Send(new SendOrPostCallback(delegate
                                {
                                    ((BindingSource)sender).ResetBindings(false);
                                }), null);                        
                ((BindingSource)sender).ListChanged += new System.ComponentModel.ListChangedEventHandler(l_bindingSource_ListChanged);
            }
    Le seul inconvénient, c'est que ResetBindings réappelle l_bindingSource_ListChanged, donc il semble que sur chaque modif du dataset le traitement du binding soit fait deux foix. Il m'aurait fallu un ListChanging() avec possibility de mettre un flag "handled" pour l'empecher de processer un deuxième fois.

    Je n'ai pas trouvé de solution qui satisfasse les problématiques à la fois architecturales et de performances, si vous avez des idées, lâchez-vous.
    ZTAB (Ze Text Adventure Builder)

    Logiciel très intuitif et ergonomique de création de jeux d'aventure et de livres dont vous êtes le héros.

    http://sites.google.com/site/ztabsoft/

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/03/2010, 09h56
  2. Réponses: 4
    Dernier message: 25/06/2007, 15h05
  3. Réponses: 5
    Dernier message: 06/02/2007, 13h46
  4. ne veut pas d'espaces entre les images dans une cellule
    Par cortex024 dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 07/12/2006, 15h30
  5. [VB6]ne pas faire la différence Maj/min dans une chaine
    Par dbozec dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 14/04/2006, 12h32

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