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 :

Multi process et variable partagé


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut Multi process et variable partagé
    Bonjour,

    J'ai une application qui au démarrage m'en lance une autre.
    Ce système est basé sur ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    Framework.Process.ThreadManager.DefaultManager.AddMethod(() =>
    {
    	if (File.Exists(System.IO.Path.Combine(Environment.CurrentDirectory, @"Utilitaires\Migration.exe")))
    	{
     
    		ProcessStartInfo PSI = new ProcessStartInfo(System.IO.Path.Combine(Environment.CurrentDirectory, @"Utilitaires\Migration.exe"));
     
    		Process P = Process.Start(PSI);
     
    		P.WaitForExit();
    	}
    });
    Ma première appli est une appli cliente qui permet d'accéder a des données via EntityFramework.
    Ma deuxième appli (lancé en supplément) est une appli qui rapatrie des données d'une BDD de données à une autre.

    Point important :
    Les 2 applications utilisent les mêmes librairies, ainsi mon objet context (EntityFramework).
    L'objet context est retourné via une méthode statique de ma librairie commune :

    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
      private static EntitiesContext _Context = null;
            public static EntitiesContext Context
            {
                get { 
     
                    if(_Context == null)
                    {
                        try
                        {
                            if (string.IsNullOrEmpty(ConnectionString))
                            {
                                _Context = new EntitiesContext();
                            }
                            else
                            {
    							_Context = new EntitiesContext(ConnectionString); 
                            }
                        }
                        catch 
                        {
                            throw;
                        }
                    }
                    return _Context; 
                }
            }
    Ma question est relativement simple, est-ce que l'object EntitiesContext des 2 applications est le même ?

    Dans l'appli client il m'est arrivé que ma fonction HasChange me return true alors que je n'ai pas encore modifié mes données. (A part que la deuxième appli était en cour d’exécution en tâche de fond)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      public bool HasChanges
            {
                get
                {
                    int Count =
                    ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added).Count()+
                    ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted).Count()+
                    ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified).Count();
     
                    return Count > 0;
                }
            }
    Le problème s'est manifesté lorsque j'ai utilisé ma fonction de sauvegarde (dans ma lib commune) qui s'est complètement emballé et à sauvegarder tout mon context courant comme s'il était entièrement changé.

    N'étant arrivé que 2 fois à des endroits totalement différents et n'arrivant pas à reproduire le problème mes questions se sont donc tournés sur le deuxième programme qui lui a pour but de mettre à jour les données de ma base.

    S'il manque de précision dans mes dires, n'hésitez pas à me le dire pour que je puisse éventuellement donner des infos plus claires.

    Je vous remercie d'avance pour toutes les réponses que vous pourrez m'apporter.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Lionhart Voir le message
    Ma question est relativement simple, est-ce que l'object EntitiesContext des 2 applications est le même ?

    non
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    Dans ce cas qu'est-ce qui peut générer le fait que ma fonction HasChange me return true alors que je n'ai fait que charger des objets ObservableCollections dans mon viewmodel afin de les binder à mon DataGrid/ItemsControls ?

    C'est vraiment étrange dans le sens ou mon réelle problème est le fait que lorsque je modifie une donnée j'enregistre les différentes modif (historique) et que dans le cas présent j'ai eu un retour de 17k ligne de modifiés.

    Ceux-ci correspondent à ce que j'ai en mémoire au moment ou je sauvegarde alors que je n'ai vraiment effectué aucun changement.

  4. #4
    Membre averti Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 369
    Points
    369
    Par défaut
    Quel est l'intéret dans le cas d'un EDMX de vouloir partager une instance entre deux applications ?

    une solution du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                using (Model1Container mod = new Model1Container())
                {
                    // ..... 
                    // manipuler es données
                    mod.SaveChanges();
                }
    permet d'isoler les threads et les transactions.
    La nature fait des choses extraordinaires, observons la et restons humble, on ne nous demande pas de refaire le monde mais juste de reproduire virtuellement des choses existantes ....

    et n'oubliez pas si vous aimez et quand vous avez la réponse

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    Justement mon objectif est de vérifier que le context est partagé car je ne veux pas qu'il le soit.

    Il s'agit d'une application que je reprends.

    D'après ce que dit Pol63 mon context n'est pas partagé.

    Mais il s'avère que j'ai des comportements aléatoires que je n'arrive pas à reproduire et qui me font penser que le context est le même dans chacunes des applis.

  6. #6
    Membre averti Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par Lionhart Voir le message
    Justement mon objectif est de vérifier que le context est partagé car je ne veux pas qu'il le soit.

    Il s'agit d'une application que je reprends.

    D'après ce que dit Pol63 mon context n'est pas partagé.

    Mais il s'avère que j'ai des comportements aléatoires que je n'arrive pas à reproduire et qui me font penser que le context est le même dans chacunes des applis.

    En passant par des pointeurs peut etre que tu va récupérer l'info, un exemple de manip de pointeur :

    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
                int number;
     
                unsafe
                {
                    // Assign the address of number to a pointer:
                    int* p = &number;
     
                    // Commenting the following statement will remove the
                    // initialization of number.
                    *p = 0xffff;
     
                    // Print the value of *p:
                    System.Console.WriteLine("Value at the location pointed to by p: {0:X}", *p);
     
                    // Print the address stored in p:
                    System.Console.WriteLine("The address stored in p: {0}", (int)p);
                }
     
                // Print the value of the variable number:
                System.Console.WriteLine("Value of the variable number: {0:X}", number);
     
                System.Console.ReadKey();
    La nature fait des choses extraordinaires, observons la et restons humble, on ne nous demande pas de refaire le monde mais juste de reproduire virtuellement des choses existantes ....

    et n'oubliez pas si vous aimez et quand vous avez la réponse

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

Discussions similaires

  1. log4j : dailyRollingFileAppender en multi process
    Par hugo123 dans le forum Logging
    Réponses: 2
    Dernier message: 16/08/2006, 13h29
  2. [CR10] Variable partagé d'un sous état dans la meme section
    Par alpachico dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 04/08/2006, 13h57
  3. Problème de variable partagée
    Par nicolas66 dans le forum Réseau
    Réponses: 9
    Dernier message: 16/06/2006, 14h35
  4. [debutant]threads - variables partagées.
    Par nivose110 dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 18/01/2006, 06h34
  5. [CR] Variables partagées
    Par titdiable dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 21/12/2004, 09h16

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