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 :

Modifier une ObservableCollection à partir d'un thread secondaire


Sujet :

C#

  1. #1
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut Modifier une ObservableCollection à partir d'un thread secondaire
    Bonjour,

    J'ai un petit souci pour modifier une classe hérité d'une observablecollection à partir d'un thread autre que le thread principale?

    Je pensais faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dispatcher.Invoke(new Action
                    (delegate
                    {
                        _database.createLogInfo("Insertion validée");
                    }));
    Cependant j'ai un message d'erreur un peu obscur pour moi : Une référence d'objet est requise pour la propriété, la méthode ou le champ non statique 'membre'
    La variable _database est un objet de type ObservableCollection<ClassViewModel>. et la classe createinfo est la suivante:
    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
     
    public void createLogInfo(String Message)
            {
                try
                {
                      LogBaseData item = new LogBaseData(DateTime.Now);
                      item.Message = Message;
                      this.Insert(0, new LogDataViewModel(item));
                      this.RemoveOldEntrie();         
                }
                catch (Exception ex)
                {
     
                    throw ex;
                }
     
     
            }
    Savez vous comment je peux faire?
    Merci de votre aide
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    La méthode du "Dispatcher.Invoke" est à appeler lors de la synchronisation avec des éléments d'IHM. C'est vrai que le but d'un ObservableCollection est de modifier des éléments d'IHM indirectement pas DataBinding, mais normalement en WPF il se débrouille.

    Pour ajouter des éléments depuis un autre Thread, il faut plutôt utiliser un "lock".

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Initialisation de l'objet lock
    readonly object _lockCollection=new object();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Ajout
    lock(_lockCollection)
    {
        _database.createLogInfo("Insertion validée");
    }
    N'hésites pas à regarder l'aide de MSDN sur le mot-clé "lock".

  3. #3
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut
    Bonsoir, merci de ton aide.
    J'ai réalisé ton code cependant, j'ai l'erreur suivante :
    Ce type de CollectionView ne prend pas en charge les modifications de son SourceCollection à partir d'un thread différent du thread du Dispatcher.
    j
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

  4. #4
    Membre habitué

    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Juillet 2009
    Messages : 62
    Points : 157
    Points
    157

  5. #5
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut
    J'en était pas loin

    Voici le code qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      System.Windows.Application.Current.Dispatcher.Invoke(
                        DispatcherPriority.Normal,
                        (Action)delegate()
                        {
                            _database.createLogInfo("Insertion validée");
                        }
                    );
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/01/2015, 17h28
  2. Modifier un form à partir d'un thread secondaire (MethodInvoker)
    Par Denethor9 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/04/2011, 10h17
  3. Réponses: 5
    Dernier message: 04/01/2007, 16h46
  4. Comment modifier une BufferedImage alimenté par un Thread
    Par jlassiramzy dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 02/08/2006, 15h04
  5. modifié une table à partir d'une requete
    Par moicats dans le forum Access
    Réponses: 5
    Dernier message: 15/05/2006, 16h37

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