コード例 #1
0
        /// //////////////////////////////////////////////////
        private static void DoCalcInThread(object objParam)
        {
            CElementsProjetARecalculer lstElements = objParam as CElementsProjetARecalculer;

            if (lstElements != null)
            {
                DoCalc(lstElements);
            }
        }
コード例 #2
0
        /// //////////////////////////////////////////////////
        ///Démarre une étape dans un thread séparé
        public static void CalcElementsInThread(CElementsProjetARecalculer lstElements)
        {
            Thread th         = new Thread(DoCalcInThread);
            int    nIdSession = lstElements.IdSession;
            //Lance l'étape dans la session root, car la sousSEssion peut être fermée avant que
            //L'étape ne soit lancée !
            CSousSessionClient session = CSessionClient.GetSessionForIdSession(lstElements.IdSession) as CSousSessionClient;

            if (session != null)
            {
                nIdSession = session.RootSession.IdSession;
            }

            th.Start(lstElements);
        }
コード例 #3
0
        //-----------------------------------------------------------------------------------------------
        public static void ASyncCalc(int nIdSession, IEnumerable <int> lstIdsProjets, IEnumerable <int> lstIdsMetaProjets)
        {
            if (lstIdsMetaProjets.Count() == 0 && lstIdsProjets.Count() == 0)
            {
                return;
            }
            CElementsProjetARecalculer lstElements = new CElementsProjetARecalculer(nIdSession);

            foreach (int nIdProjet in lstIdsProjets)
            {
                lstElements.AddProjet(nIdProjet);
            }
            foreach (int nIdMetaProjet in lstIdsMetaProjets)
            {
                lstElements.AddMetaProjet(nIdMetaProjet);
            }

            CalcElementsInThread(lstElements);
        }
コード例 #4
0
        /// //////////////////////////////////////////////////
        ///Lance le calcul
        public static void DoCalc(CElementsProjetARecalculer lstElements)
        {
            CResultAErreur result  = CResultAErreur.True;
            CDbKey         keyUser = null;
            //Attend la fin des transactions en cours pour la session principale
            IDatabaseConnexion cnx = null;

            do
            {
                CSessionClient session = CSessionClient.GetSessionForIdSession(lstElements.IdSession);
                if (session != null && session.IsConnected)
                {
                    IInfoUtilisateur info = session.GetInfoUtilisateur();
                    //TESTDBKEYOK
                    if (info != null)
                    {
                        keyUser = info.KeyUtilisateur;
                    }
                    try
                    {
                        cnx = CSc2iDataServer.GetInstance().GetDatabaseConnexion(lstElements.IdSession, typeof(CProjet));
                    }
                    catch //En cas d'erreur, c'est probablement que la session a été fermée, du coup, on peut y aller !
                    {
                        cnx = null;
                    }
                    System.Threading.Thread.Sleep(50);
                }
                else
                {
                    cnx = null;
                }
            }while (cnx != null && cnx.IsInTrans());
            lock (typeof(CLockerStartEtape))//S'assure que deux étapes ne démarrent pas en même temps !
            {
                CAuthentificationSessionProcess auth = new CAuthentificationSessionProcess();

                using (CSessionClient sousSession = CSessionClient.CreateInstance())
                {
                    try
                    {
                        sousSession.OpenSession(auth, "Projet asynchronous calc ", ETypeApplicationCliente.Process);
                        if (keyUser != null)
                        {
                            sousSession.ChangeUtilisateur(keyUser);
                        }
                        using (CContexteDonnee ctx = new CContexteDonnee(sousSession.IdSession, true, true))
                        {
                            SetModeCalculProjet(ctx);
                            foreach (int nIdProjet in lstElements.IdsProjets)
                            {
                                CProjet projet = new CProjet(ctx);
                                if (projet.ReadIfExists(nIdProjet))
                                {
                                    projet.RecalculateDates(false);
                                }
                            }
                            foreach (int nIdMetaProjet in lstElements.IdsMetaProjets)
                            {
                                CMetaProjet meta = new CMetaProjet(ctx);
                                if (meta.ReadIfExists(nIdMetaProjet))
                                {
                                    meta.UpdateDateDebutPlanifieeFromChilds(false);
                                    meta.UpdateDateFinPlanifieeFromChilds(false);
                                    meta.UpdateDateDebutReelleFromChilds(false);
                                    meta.UpdateDateFinReelleFromChilds(false);
                                    meta.CalcProgress(false);
                                }
                            }

                            result = ctx.SaveAll(false);
                        }
                    }
                    catch (Exception e)
                    {
                    }
                    finally
                    {
                        sousSession.CloseSession();
                    }
                }
            }
        }